前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >redisson的MultiLock连锁

redisson的MultiLock连锁

作者头像
IT云清
发布2019-01-22 15:30:53
2.6K0
发布2019-01-22 15:30:53
举报
文章被收录于专栏:IT云清IT云清
redisson中的MultiLock,可以把一组锁当作一个锁来加锁和释放。
1.官方文档的解释:

Redis based distributed RedissonMultiLock object groups multiple RLock objects and handles them as one lock. Each RLock object may belong to different Redisson instances.

基于Redis的分布式RedissonMultiLock对象将多个RLock对象分组,并将它们作为一个锁处理。每个RLock对象可能属于不同的Redisson实例。

RLock lock1 = redissonInstance1.getLock("lock1");
RLock lock2 = redissonInstance2.getLock("lock2");
RLock lock3 = redissonInstance3.getLock("lock3");

RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
// locks: lock1 lock2 lock3
lock.lock();
...
lock.unlock();

If Redis nodes stored lock state crash and multiple locks have been already acquired then they could hang forever. To avoid this Redisson maintains lock watchdog, it prolongs each lock expiration while lock holder Redisson instance is alive. By default lock watchdog timeout is 30 seconds and can be changed through Config.lockWatchdogTimeout setting.

如果Redis节点存储的锁状态崩溃,并且已经获得多个锁,那么它们可能永远挂起。为了避免这种情况,Redisson维护了一个监控锁的看门狗,它在锁持有者Redisson实例活动时延长每个锁过期时间。默认情况下锁看门狗超时时间为30秒,可以通过Config的lockWatchdogTimeout进行设置。

Also Redisson allow to specify leaseTime parameter during lock acquisition. After specified time interval all locked locks will be released automatically.

此外,Redisson允许在锁获取期间指定leaseTime参数。在指定的时间间隔后,所有锁将自动释放。

RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
// Acquire lock1, lock2, lock3 and release it automatically after 10 seconds
// if unlock method hasn't been invoked
lock.lock(10, TimeUnit.SECONDS);

// Wait for 100 seconds and automatically unlock it after 10 seconds
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
...
lock.unlock();
2.用法示例

几个锁,会被当作一组锁,然后这一组锁,当做一个锁,进行加锁和释放锁,可以设置过期时间,在过期时间到来时,所有的锁都会被主动释放,这可以预防,因为服务的崩溃,导致锁hang住不释放的情况。

  public void multiLock(Integer expireTime,TimeUnit timeUnit,String ...lockKey){
    RLock [] rLocks = new RLock[lockKey.length];
    for(int i = 0,length = lockKey.length; i < length ;i ++){
      RLock lock = redissonClient.getLock(lockKey[i]);
      rLocks[i] = lock;
    }
    RedissonMultiLock multiLock = new RedissonMultiLock(rLocks);
    multiLock.lock(expireTime,timeUnit);
    logger.info("【Redisson lock】success to acquire multiLock for [ "+lockKey+" ],expire time:"+expireTime+timeUnit);
  }

相关资料: https://blog.csdn.net/u010359884/article/details/50310387 https://github.com/redisson/redisson/wiki/1.-概述 http://redis.cn/topics/distlock.html https://blog.csdn.net/qq523786283/article/details/80648469 https://blog.csdn.net/lijingyao8206/article/details/51150936

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年11月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • redisson中的MultiLock,可以把一组锁当作一个锁来加锁和释放。
  • 1.官方文档的解释:
  • 2.用法示例
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档