redis分布式锁死锁处理方案 redis分布式锁超时了

分布式锁的一些细节问题,值得收藏1、锁的释放问题:多个客户端竞争同一把锁时,会出现一个客户端释放了锁,但别的客户端并没有释放的情况 。这会导致别的客户端无法获取到锁,从而无法继续执行后续的操作 。
2、但是在分布式系统中,这种方式就失效了;由于分布式系统多线程、多进程并且分布在不同机器上 , 这将使单机并发控制锁策略失效 , 为了解决这个问题就需要一种跨 JVM 的互斥机制来控制共享资源的访问 。
3、上面这个分布式锁的实现中,大体能够满足了一般的分布式集群竞争锁的需求 。这里说的一般性场景是指集群规模不大,一般在10台机器以内 。
4、与分布式锁对应的是【单机锁】,我们在写多线程程序时,避免同时操作一个共享变量而产生数据问题 , 通常会使用一把锁来实现【互斥】,其使用范围是在【同一个进程中】 。(同一个进程内存是共享的,以争抢同一段内存,来判断是否抢到锁) 。
redis分布式锁常见问题及解决方案1、使用redis客户端redisson,redisson很好的解决了redis在分布式环境下的一些棘手问题 , 它的宗旨就是让使用者减少对Redis的关注,将更多精力用在处理业务逻辑上 。
2、锁的释放问题:多个客户端竞争同一把锁时,会出现一个客户端释放了锁,但别的客户端并没有释放的情况 。这会导致别的客户端无法获取到锁,从而无法继续执行后续的操作 。
3、比如,SSD将内存换成了磁盘,以换取更大的容量 。
4、释放锁的时候,只需要删除 del key 这个 key 就行了 。
5、问题-1 如果setnx执行成功,但是在expire执行的时候redis节点宕机了,在这种情况下 , 锁不会被释放,导致死锁 。
6、针对这个场景,对应的解决方案一般来说有三种 。借助Redis setNX命令设置一个标志位就行 。设置成功的放行,设置失败的就轮询等待 。
redis分布式锁可能出现的问题1、锁的释放问题:多个客户端竞争同一把锁时 , 会出现一个客户端释放了锁,但别的客户端并没有释放的情况 。这会导致别的客户端无法获取到锁,从而无法继续执行后续的操作 。
2、Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如果超出了锁的超时时间就会出现问题 。
3、问题-1 如果setnx执行成功,但是在expire执行的时候redis节点宕机了,在这种情况下,锁不会被释放,导致死锁 。
4、释放锁的时候,只需要删除 del key 这个 key 就行了 。
【redis分布式锁死锁处理方案 redis分布式锁超时了】5、肯定是会占用一部分资源的 , 需要根据项目情况来确定是否使用,代码看注释部分差异 。redisson分布式锁的使用参考上一篇博文 。
6、这时系统在业务语义上一定会出现问题,导致各种脏数据的产生 。
Redis分布式锁的原理是什么?如何续期?所以这个就是redis cluster,或者是redis master-slave架构的主从异步复制导致的redis分布式锁的最大缺陷:在redis master实例宕机的时候,可能导致多个客户端同时完成加锁 。
redis是保持的AP而非CP,如果要追求强一致性可以使用zookeeper分布式锁,但是zookeeper也不是完全没问题,在出现网络颜值 , 客户端与服务端失联情况的时候也依然可能会出现分布式的问题 。
分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性 。

    推荐阅读