Redis实现分布式锁

本文探讨了分布式锁的背景,如何使用Redis实现分布式锁,包括SETNX操作、过期时间管理和死锁预防。还介绍了Redisson库在分布式锁中的应用,以及如何通过lua脚本和看门狗机制防止误删除和锁失效问题。
摘要由CSDN通过智能技术生成

1、分布式锁应用背景

首先讲讲为什么JDK提供的锁不能实现分布式锁, JDK提供的锁是基于JVM实现的,当我们采用分布式架构开发项目时,这些JDK提供的锁不能解决不同机器之间的多进程数据安全的问题.因此,要想实现分布式锁,我们就需要引入第三方来做锁处理.

2、实现方式

Redis分布式锁的加锁,使用SETNX给Key键设置一个UUID的值和过期时间,只有键不存在时才能设置成功,如果键已经存在就会设置失败,其他进程执行前会判断Redis中这个Key是否有值,如果发现这个Key有值了,就说明已有其他进程在执行,则我们让它睡眠一段时间,再让它重新重试获取锁.

3、如何避免死锁

我们可以采用给key设置值时同时设置一个过期时间,让它自己自动过期;同时使用try-finally结构,在finally中手动进行锁的释放,避免任务代码运行过程中抛出异常,锁又没有来得及释放造成死锁.

4、如何防止误删除锁

误删除锁:主要是一个客户端误将其他客户端的锁解开.比如客户端A加锁,一段时间之后客户端A执行完任务代码,在进入unlock后执行jedis.del()之前,锁突然过期了,此时客户端B尝试加锁成功,然后客户端A再执行del()方法,这时候客户端A就会将客户端B的锁给解除了.

我们在加锁时,需要设置键的值必须唯一,因此可以生成一个UUID作为值,然后在删除该键前先判断该键对应的值是否是当前客户端之前设置的UUID,防止误删除.

5、Redisson实现分布式锁

1、加锁机制

多个客户端进程程尝试去获取锁,如果获取成功: 执行lua脚本,保存数据到redis数据库.

如果获取失败: 一直通过while循环尝试获取锁,获取成功后,执行lua脚本,保存数据到redis数据库.

2、watch dog自动延期机制

为了避免之前提到的误删锁的发生,Redisson内部提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期.默认情况下,看门狗的检查锁的超时时间是30秒钟,也可以通过修改Config.lockWatchdogTimeout来另行指定.

3、使用lua脚本

Redisson通过封装在lua脚本中发送给Redis,而且Redis是单线程执行命令,这样就保证这段复杂业务逻辑执行的原子性.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值