redis分布式锁理解

 

redis有一个命令是setIfAbsent,只要redis里存在了这个值还会false,或者还会true。

每个线程进来时,都先判断是否有(Boolean result = strRedisTrmplate.opsForValue().setIfAbsent("键","值") ),如果为true(数据库之前不存在这个值),就设置进去,执行业务代码,最后删除这个值(strRedisTrmplate。delete("键"))

业务代码进行try, 删除操作必须放在filnally里面。避免业务代码错误,不然所有线程过来都会拿到false。

但是如果系统突然宕机了,删除操作还是没有执行到,也会出现问题。这个时候就必须给setIfAbsent 设置过期时间, strRedisTrmplate.opsForValue().setIfAbsent("键","值",10,TimeUnit.SECINDS),如果业务代码执行超过10秒,那其他线程进来可能就这个加锁就会失效(比如第一个线程执行15秒,10秒的时候加锁失效,第二个线程进来又加锁成功,5秒后第一个线程把第二个的删除了,第三个线程又进来,如此循环会造成线程会删除不是自己线程的锁,这个时候为了避免删除其他线程的锁,会把值改成线程的唯一id,只有线程id才能删除自己的锁)。但是还是怕这个时间设置得不够(业务执行时间太长),这个时候会增加一个定时器,查看当前线程是否在执行,如果还在执行,就给redis增加时间(续命)。这个就有一个插件(redisson)他就实现这些操作。

但是为了更好保证完全没有问题的话,最后使用zookeeper分布锁。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis分布式锁是一种通过Redis实现的分布式锁机制。它可以用于在分布式环境下实现对共享资源的互斥访问。Redis分布式锁的实现方式有很多种,比如基于SETNX命令的方式,通过在Redis中设置一个特定的键值对来表示锁的状态。具体而言,使用SETNX命令可以尝试给定的键设置一个值,只有当键不存在时才会设置成功。因此,可以将这个键理解为锁,如果某个操作成功设置了这个键值对,则表示该操作成功获取到了锁,可以执行后续的操作。而其他尝试获取锁的操作如果发现这个键已经存在,则表示锁已经被其他操作持有,需要等待或放弃获取锁。为了保证线程安全,获取锁和释放锁的过程需要保持原子性,可以使用Redis的事务或者Lua脚本来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [redis分布式锁的这些坑,我怀疑你是假的开发](https://blog.csdn.net/devcloud/article/details/113679242)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Redis 分布式锁](https://blog.csdn.net/weixin_41850404/article/details/84937693)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值