redison 自动续期的 分布式锁
1 导入 maven
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.11.1</version> </dependency>
2 初始化redisson 客户端(redison 支持 单机,主从,哨兵,分布式集群4 中模式)
@Bean public RedissonClient redissonClient() { Config config = new Config(); config.useSingleServer().setAddress("redis://ip:端口"); RedissonClient redisson = Redisson.create(config); return redisson; }
3 redison 可以为锁自动续租,原理就是维持了一个定时任务,给隔10 秒吧锁的过期时间设置为30 秒。如果这时候rredison 客户端退出,这个续期的定时任务被释放,锁就会过期。
RLock lock = redissonClient.getLock("lockName");
try {
if( lock.tryLock() ) {
System.out.println("拿到锁了做点事");
}
}catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
4 redison 还提供了不续租的方法,可以指定 请求锁等待时间,和 锁过期时间的方法

5 不带参数的 是不等锁(一次获取不到直接返回),锁自动续期。
6 redison 的 获取锁默认是非公平的(随机抢锁),可以使用getFairLock获取公平锁(按时间顺序获取锁)
RLock lock = redissonClient.getFairLock("lockName");
try {
if( lock.tryLock() ) {
System.out.println("拿到锁了做点事");
}
}catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
7 redis 也有读写锁
RReadWriteLock lock = redissonClient.getReadWriteLock("lockName");
lock.readLock();
lock.writeLock();
8 getMultiLock 吧几把锁当做一把锁。( 是获取到全部的锁才算获取到了 这把多锁 )

测试如果调用了t1锁定了 lock1 不释放,t2 获取不到锁。并且不会等待,直接返回。
@PostMapping("t1")
public String t1() {
RLock lock = redissonClient.getLock("lock1");
try {
if( lock.tryLock() ) {
System.out.println("拿到锁了做点事");
}
}catch (Exception e) {
e.printStackTrace();
}
return "{}";
}
@PostMapping("t2")
public String t2() {
RLock lock1 = redissonClient.getLock("lock1");
RLock lock2 = redissonClient.getLock("lock2");
RLock lock3 = redissonClient.getLock("lock3");
RLock lockMulti = redissonClient.getMultiLock(lock1,lock2,lock3);
try {
if( lockMulti.tryLock() ) {
System.out.println("lockMulti拿到锁了做点事");
}
}catch (Exception e) {
e.printStackTrace();
}
return "{}";
}
9 redison 提供了 原子的 long 和 double ,可以对 原子的线程安全的修改 数据
getAndAdd 相当于i++,addAndGet 相当于++i
RAtomicDouble rdouble = redissonClient.getAtomicDouble("money");
double d1 = rdouble.getAndAdd(1);
double d2 = rdouble.addAndGet(1);
System.out.println(d1);
System.out.println(d2);
10 并且提供了 二进制流,各种队列,各种集合,布隆过滤器,桶,GEO,发布订阅模型

11 redison 提供了 countDownLatch 数量下降锁
RCountDownLatch rCountDownLatch = redissonClient.getCountDownLatch("");
rCountDownLatch.trySetCount( 100 );
rCountDownLatch.countDown();
12 RedissonRedLock ,这个是个分布式多节点锁。只要获取超过一半的锁就算成功

备注:Redison 提供了自动续租的分布式锁,但是我们不能一味的就用自动续期的锁,很多时候我们不希望无限的等锁,redis 默认的会自动过期的锁就够了。添加用户判断用户名是否重复,一般等几秒等不到锁具注册失败就行了,在默写情况比如执行一个长耗时的任务,这时候我们才可能会需要无限等待的锁。
能耍的时候就一定要耍,不能耍的时候一定要学。
--天道酬勤,贵在坚持posted on 2022-03-12 18:58 zhangyukun 阅读(4948) 评论(0) 收藏 举报
浙公网安备 33010602011771号