专栏首页IT云清redisson的MultiLock连锁

redisson的MultiLock连锁

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LinkedBlockingQueue和ArrayBlockingQueue对比

    对比一下LinkedBlockingQueue和ArrayBlockingQueue的区别。

    IT云清
  • 16.Elasticsearch更新文档2---局部更新1---脚本更新1

    会发现:view_time被+1了,而且,每修改一次这个文档,他的版本号都会改变。

    IT云清
  • 18.Elasticsearch更新文档4---局部更新3---restAPI

    在 更新整个文档 , 我们已经介绍过 更新一个文档的方法是检索并修改它,然后重新索引整个文档;然而,使用 update API 我们还可以部分更新文档,例如在某...

    IT云清
  • Go 并发实战 -- sync RWMutex

    sync中包含Mutex、RWMutex两个排他锁,上一篇介绍了最基础的Mutex锁,本篇来说一下基于Mutex实现的RWMutex,RWMutex是一把读写锁...

    邹志全
  • C++核心准则CP.43:尽量减少花费在临界区中的时间​

    The less time is spent with a mutex taken, the less chance that another thread h...

    面向对象思考
  • mysql 隔离级别的实现

    本文探讨innodb如何使用mvcc和各种锁机制,保障mysql的四层隔离等级的。

    平凡的学生族
  • 命名函数表达式探秘

    本想直接转载过来的,发现效果不太好。而且想起之前好像看过中文,感谢随之漫笔的翻译,它为前端开发作出了不少贡献,很感谢这样的译者。

    meteoric
  • innodb锁机制探究(一)

    在之前的文章中,我们说过三次关于锁的文章,分别是去年的12月25号、12月26号以及今年的1月14号的文章,这3篇文章里面简单介绍过一些锁的知识点,后续我...

    AsiaYe
  • 聊一聊Java中的文件锁

    当读写文件时,需要确保有适当的文件锁定机制,来保证基于并发I/O应用程序的数据完整性。

    良月柒
  • Python3 与 C# 并发编程之~ 进程实战篇

    之前说过 Queue:在 Process之间使用没问题,用到 Pool,就使用 Manager().xxx, Value和 Array,就不太一样了:

    逸鹏

扫码关注云+社区

领取腾讯云代金券