
分布式锁
罗彬桦
君子以自强不息
展开
-
分布式锁的对比
多种分布式锁实现方案,我将如何选择?分布式锁实现方案优缺点分析Curator对集群压力比较大不推荐自己编写的分布式锁推荐Redisson和Curator实现的分布式锁原创 2021-05-29 15:15:56 · 191 阅读 · 0 评论 -
redisson分布式锁
基于Redisson实现分布式锁我们一起Coding吧!引入Redisson的jar包进行Redisson与Redis的配置使用分布式锁通过JAVA API方式引入RedissonSpring项目引入RedissonSpring Boot项目引入Redisson官网redisson.org如果是引入redisson的jar包如果是springboot引入是不同的,具体看官网下面是Spring引入具体测试架构application.propertieslogging.pa原创 2021-05-29 15:05:26 · 232 阅读 · 1 评论 -
curator布式锁
基于Zookeeper的Curator客户端实现分布式锁我们一起Coding吧!引入curator客户端curator已经实现了分布式锁的方法直接调用即可官网curator.apache.org引入需要jar包 @Test public void testCuratorLock(){ RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3); CuratorFramework c原创 2021-05-29 03:32:17 · 192 阅读 · 0 评论 -
zookeeper分布式锁代码实现
zookeeper分布式锁代码实现引入与自身安装zookeeper版本的包zk锁封装package com.example.distributezklock.lock;import lombok.extern.slf4j.Slf4j;import org.apache.zookeeper.*;import org.apache.zookeeper.data.Stat;import java.io.IOException;import java.util.Collections;i原创 2021-05-29 03:13:49 · 187 阅读 · 0 评论 -
zookeeper分布式原理
Zookeeper的观察器可设置观测器的3个方法:getData();getChildren();exists();节点数据发生变化,发送给客户端观测器只能监控一次,再监控需重新设置实现原理利用Zookeeper的瞬时有序节点的特性多线程并发创建瞬时节点时,得到有序的序列序号最小的线程获得锁其他的线程则监听自己序号的前一个序号前一个线程执行完成,删除自己序号的节点下一个序号的线程得到通知,继续执行以此类推创建节点时,已经确定了线程的执行顺序原理图解...原创 2021-05-28 18:56:16 · 85 阅读 · 0 评论 -
基于分布式锁解决定时任务重复问题
我们一起Coding吧!根据上述原理,编写Redis分布式锁定时任务集群部署,任务重复执行?利用分布式锁解决重复执行的问题定时任务部署集群RedisLockpackage com.example.distributelock.lock;import lombok.extern.slf4j.Slf4j;import org.springframework.data.redis.connection.RedisStringCommands;import org.springframew原创 2021-05-28 10:30:24 · 405 阅读 · 0 评论 -
基于redis实现分布式锁
基于redis实现分布式锁RedisLockController@RestControllerpublic class RedisLockController { @RequestMapping("redisLock") public String redisLock(){ } return "";}原创 2021-05-28 01:07:22 · 85 阅读 · 0 评论 -
redis分布式锁原理
基于Redis的Setnx实现分布式锁实现原理获取锁的Redis命令SET resource_name my_random_value NX PX 30000resource_name: 资源名称,可根据不同的业务区分不同的锁my_random_value: 随机值,每个线程的随机值都不同,用于释放锁时的校验NX:key不存在时设置成功,key存在则设置不成功PX:自动失效时间,出现异常情况,锁可以过期失效利用NX的原子性,多个线程并发时,只有一个线程可以设置成功设置成功即获得锁,原创 2021-05-27 01:48:14 · 121 阅读 · 0 评论 -
基于数据库的分布式锁
基于数据库悲观锁的分布式锁多个进程、多个线程访问共同组件数据库通过select…for update访问同一条数据for update锁定数据,其他线程只能等待先创建好表开启两个,并将事务设置为不自动提交session1session2检索不出来的。如果我不加锁,是检索的出来的。先写接口再写数据库sql...原创 2021-05-27 00:39:18 · 150 阅读 · 0 评论 -
单体应用锁的局限性
单体应用锁的局限性单体架构不能跨JVM,它们之间的锁是不能跨界的。基于数据库悲观锁的分布式锁开启两个服务,一个8080,一个8081,发现是不能锁住的。原创 2021-05-26 20:37:07 · 189 阅读 · 0 评论 -
基于ReentrantLock锁解决超卖问题
超卖现象二:解决方法基于Synchronized锁解决超卖问题(最原始的锁)基于ReentrantLock锁解决超卖问题(并发包中的锁)基于ReentrantLock锁(可重复锁)解决超卖问题package com.example.distributedemo.service;import com.example.distributedemo.dao.OrderItemMapper;import com.example.distributedemo.dao.OrderMapper;imp原创 2021-05-26 19:56:25 · 334 阅读 · 0 评论 -
基于Synchronized锁解决超卖问题
基于Synchronized锁解决超卖问题在方法上加一个synchronized锁哪个线程抢到这把锁,哪个执行。我们需要手动控制事务方法当中获取事务在最后手动提交事务事务回滚如果使用Synchronized的块去解决private Object object = new Object();public synchronized Integer createOrder() throws Exception{ TransactionStatus transaction = pla原创 2021-05-26 19:34:09 · 281 阅读 · 0 评论 -
超卖现象二&
超卖现象一:产生原因超卖现象一:解决方法update的行锁扣减库存不在程序中进行,而是通过数据库向数据库传递库存增量,扣减1个库存,增量为-1在数据库update语句计算库存,通过update行锁解决并发超卖现象二系统中库存变为-1卖家不知所措,询问平台客服超卖现象二:产生原因并发检验库存,造成库存充足的假象update更新库存,导致库存为负数原本的校验代码第一种方法:这个解决思路没用到锁超卖现象二:解决方法校验库存、扣减库存统一加锁使之成为原子性的操原创 2021-05-26 16:07:45 · 138 阅读 · 0 评论 -
超卖现象一
设计超卖现象数据库设计三张表order 订单order_item 订单项表product 商品表productproduct_name 商品名称price 价格count 数量product_desc 商品描述create_time 创建时间create_user 创建人update_time 更新时间update_user 更新人orderorder_status 订单状态receiver_name 收货人姓名receiver_mobile 收货人电话order原创 2021-05-26 14:19:47 · 425 阅读 · 0 评论 -
使用锁解决电商中的超卖
如何使用锁解决电商项目中超卖的问题?什么是超卖?举例:某件商品库存数量10件,结果卖出15件商品卖出数量超出了库存数量超卖导致商家没有商品发货、发货时间延长买卖双方易发生纠纷超卖现象一系统中库存为1,但是产生了两笔订单卖家在商品发货时,发现只有1件商品,但是有2笔订单假如商品只剩下最后一件A和B同时看到这个商品,加入购物车,并同时提交订单超卖产生的现象超卖现象一:产生原因扣减库存的动作 在程序中进行 在程序中计算剩余库存并发的场景下,导致库存计算错误超卖现象一原创 2021-05-26 01:12:12 · 397 阅读 · 0 评论