Redisson 实现分部式锁
java 客户端,数据网格 实现了很多 java 里支持的接口和数据结构
Redisson 是一个 java 操作 redis 的客户端,提供了大量分部式数据集来简化对 redis 的操作和使用,可以让开发者像使用本地集合一样使用 redis
引入 redisson
- 引入依赖
- 创建配置类
- 像操作 List 一样操作 RList(分部式集合List)
简单的测试类
因为我执行了两次,所以添加了两个
实现定时任务+锁
在定时任务中加上分部式锁
-
首先引入Bean,也就是RedissonClient
-
创建锁对象 此处的key是需要你自己存的,为了不与缓存中的内容冲突,要保持唯一性
-
获取锁,并写入规则
在尝试获取锁的时候我们要给锁添加规则,一共要传三个参数:- waitTime(等待时间):也就是在一个线程拿到锁并释放锁之后等待多久其他的线程再次进行抢锁,如果我们只需要执行一次的话,就传入0。(只有一个线程能获取到锁) 例如:传送的是10s的话,假如A先拿到锁,执行完程序释放后,10s之后B、C...等线程会再次竞争锁,填0的话A执行完就不会再竞争了。
- leaseTime(持续时间):锁多久之后被释放。
- TimeUnit:时间类型、指定leaseTime的时间单位,比如leaseTime传的是10,我此处可以指定它的单位为10s(TimeUnit.MILLSECONDS)
lock.tryLock()返回的是一个boolean,也就是拿到锁了之后我们再进行执行内容,所以放到if条件中。
-
释放锁 此处的释放锁需要判断是否是自己的锁,不然会出现误释放别人的锁,那么就要判断是否为自己的锁 lock.isHeldByCurrentThread():判断此锁是否为当前线程的id。 但是此内容不能直接加载执行内容中,因为有可能内容执行的时候报错了,没有执行到此代码。所以我们要放在try.catch.finally之中
-
测试 启动三个项目,预期结果只有一个项目会查询数据库
-
实现看门狗机制并测试 看门狗就是如果锁持续时间内程序没有执行完,就自动续期。 如果像启用看门狗机制,就需要将leaseTime设置为-1,这样程序默认的leaseTime就是30s,然后每10s进行一次查看线程有没有执行完,如果没有那么在20s的时候就会进行一次续期(再次变成30s)。
这样我们增加一个sleep,因为打断点会让程序误认为服务器宕机,就不会进行续期了
这两幅图可以看到,第一次执行到了28s,等到了20s的时候又自动续到了30s 到此redisson实现分布式锁就完成了