redison 自动续期的 分布式锁
1 导入 maven
org.redisson redisson 3.11.1
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 默认的会自动过期的锁就够了。添加用户判断用户名是否重复,一般等几秒等不到锁具注册失败就行了,在默写情况比如执行一个长耗时的任务,这时候我们才可能会需要无限等待的锁。