原文:https://www.jianshu.com/p/cde0700f0128

1. 可重入锁(Reentrant Lock)

Redisson的分布式可重入锁RLock Java对象实现了java.util.concurrent.locks.Lock接口,同时还支持自动过期解锁。

  1. public void testReentrantLock(RedissonClient redisson){
  2. RLock lock = redisson.getLock("anyLock");
  3. try{
  4. // 1. 最常见的使用方法
  5. //lock.lock();
  6. // 2. 支持过期解锁功能,10秒钟以后自动解锁, 无需调用unlock方法手动解锁
  7. //lock.lock(10, TimeUnit.SECONDS);
  8. // 3. 尝试加锁,最多等待3秒,上锁以后10秒自动解锁
  9. boolean res = lock.tryLock(3, 10, TimeUnit.SECONDS);
  10. if(res){ //成功
  11. // do your business
  12. }
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. } finally {
  16. lock.unlock();
  17. }
  18. }

Redisson同时还为分布式锁提供了异步执行的相关方法:

  1. public void testAsyncReentrantLock(RedissonClient redisson){
  2. RLock lock = redisson.getLock("anyLock");
  3. try{
  4. lock.lockAsync();
  5. lock.lockAsync(10, TimeUnit.SECONDS);
  6. Future<Boolean> res = lock.tryLockAsync(3, 10, TimeUnit.SECONDS);
  7. if(res.get()){
  8. // do your business
  9. }
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. } catch (ExecutionException e) {
  13. e.printStackTrace();
  14. } finally {
  15. lock.unlock();
  16. }
  17. }

2. 公平锁(Fair Lock)

Redisson分布式可重入公平锁也是实现了java.util.concurrent.locks.Lock接口的一种RLock对象。在提供了自动过期解锁功能的同时,保证了当多个Redisson客户端线程同时请求加锁时,优先分配给先发出请求的线程。

  1. public void testFairLock(RedissonClient redisson){
  2. RLock fairLock = redisson.getFairLock("anyLock");
  3. try{
  4. // 最常见的使用方法
  5. fairLock.lock();
  6. // 支持过期解锁功能, 10秒钟以后自动解锁,无需调用unlock方法手动解锁
  7. fairLock.lock(10, TimeUnit.SECONDS);
  8. // 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
  9. boolean res = fairLock.tryLock(100, 10, TimeUnit.SECONDS);
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. } finally {
  13. fairLock.unlock();
  14. }
  15. }

Redisson同时还为分布式可重入公平锁提供了异步执行的相关方法:

  1. RLock fairLock = redisson.getFairLock("anyLock");
  2. fairLock.lockAsync();
  3. fairLock.lockAsync(10, TimeUnit.SECONDS);
  4. Future<Boolean> res = fairLock.tryLockAsync(100, 10, TimeUnit.SECONDS);

3. 联锁(MultiLock)

Redisson的RedissonMultiLock对象可以将多个RLock对象关联为一个联锁,每个RLock对象实例可以来自于不同的Redisson实例。

  1. public void testMultiLock(RedissonClient redisson1,
  2. RedissonClient redisson2, RedissonClient redisson3){
  3. RLock lock1 = redisson1.getLock("lock1");
  4. RLock lock2 = redisson2.getLock("lock2");
  5. RLock lock3 = redisson3.getLock("lock3");
  6. RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
  7. try {
  8. // 同时加锁:lock1 lock2 lock3, 所有的锁都上锁成功才算成功。
  9. lock.lock();
  10. // 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
  11. boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. } finally {
  15. lock.unlock();
  16. }
  17. }

4. 红锁(RedLock)

Redisson的RedissonRedLock对象实现了Redlock介绍的加锁算法。该对象也可以用来将多个RLock
对象关联为一个红锁,每个RLock对象实例可以来自于不同的Redisson实例。


  1. public void testRedLock(RedissonClient redisson1,
  2. RedissonClient redisson2, RedissonClient redisson3){
  3. RLock lock1 = redisson1.getLock("lock1");
  4. RLock lock2 = redisson2.getLock("lock2");
  5. RLock lock3 = redisson3.getLock("lock3");
  6. RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);
  7. try {
  8. // 同时加锁:lock1 lock2 lock3, 红锁在大部分节点上加锁成功就算成功。
  9. lock.lock();
  10. // 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
  11. boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. } finally {
  15. lock.unlock();
  16. }
  17. }

5. 读写锁(ReadWriteLock)

Redisson的分布式可重入读写锁RReadWriteLock Java对象实现了java.util.concurrent.locks.ReadWriteLock接口。同时还支持自动过期解锁。该对象允许同时有多个读取锁,但是最多只能有一个写入锁。

  1. RReadWriteLock rwlock = redisson.getLock("anyRWLock");
  2. // 最常见的使用方法
  3. rwlock.readLock().lock();
  4. // 或
  5. rwlock.writeLock().lock();
  6. // 支持过期解锁功能
  7. // 10秒钟以后自动解锁
  8. // 无需调用unlock方法手动解锁
  9. rwlock.readLock().lock(10, TimeUnit.SECONDS);
  10. // 或
  11. rwlock.writeLock().lock(10, TimeUnit.SECONDS);
  12. // 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
  13. boolean res = rwlock.readLock().tryLock(100, 10, TimeUnit.SECONDS);
  14. // 或
  15. boolean res = rwlock.writeLock().tryLock(100, 10, TimeUnit.SECONDS);
  16. ...
  17. lock.unlock();

6. 信号量(Semaphore)

Redisson的分布式信号量(Semaphore)Java对象RSemaphore采用了与java.util.concurrent.Semaphore相似的接口和用法。

  1. RSemaphore semaphore = redisson.getSemaphore("semaphore");
  2. semaphore.acquire();
  3. //或
  4. semaphore.acquireAsync();
  5. semaphore.acquire(23);
  6. semaphore.tryAcquire();
  7. //或
  8. semaphore.tryAcquireAsync();
  9. semaphore.tryAcquire(23, TimeUnit.SECONDS);
  10. //或
  11. semaphore.tryAcquireAsync(23, TimeUnit.SECONDS);
  12. semaphore.release(10);
  13. semaphore.release();
  14. //或
  15. semaphore.releaseAsync();

7. 可过期性信号量(PermitExpirableSemaphore)

Redisson的可过期性信号量(PermitExpirableSemaphore)实在RSemaphore对象的基础上,为每个信号增加了一个过期时间。每个信号可以通过独立的ID来辨识,释放时只能通过提交这个ID才能释放。

  1. RPermitExpirableSemaphore semaphore = redisson.getPermitExpirableSemaphore("mySemaphore");
  2. String permitId = semaphore.acquire();
  3. // 获取一个信号,有效期只有2秒钟。
  4. String permitId = semaphore.acquire(2, TimeUnit.SECONDS);
  5. // ...
  6. semaphore.release(permitId);

8. 闭锁(CountDownLatch)

Redisson的分布式闭锁(CountDownLatch)Java对象RCountDownLatch采用了与java.util.concurrent.CountDownLatch相似的接口和用法。

  1. RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");
  2. latch.trySetCount(1);
  3. latch.await();
  4. // 在其他线程或其他JVM里
  5. RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");
  6. latch.countDown();

使用Redisson实现分布式锁的更多相关文章

  1. Redisson实现分布式锁

    转: Redisson实现分布式锁 Redisson文档参考:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 redis是实现 ...

  2. 使用Redisson实现分布式锁,Spring AOP简化之

    源码 Redisson概述 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid).它不仅提供了一系列的分布式的Java常用对象,还提供了许多 ...

  3. Redisson实现分布式锁(3)—项目落地实现

    Redisson实现分布式锁(3)-项目落地实现 有关Redisson实现分布式锁前面写了两篇博客作为该项目落地的铺垫. 1.Redisson实现分布式锁(1)---原理 2.Redisson实现分布 ...

  4. Redisson实现分布式锁(2)—RedissonLock

    Redisson实现分布式锁(2)-RedissonLock 有关Redisson实现分布式锁上一篇博客讲了分布式的锁原理:Redisson实现分布式锁---原理 这篇主要讲RedissonLock和 ...

  5. Redisson实现分布式锁(1)---原理

    Redisson实现分布式锁(1)---原理 有关Redisson作为实现分布式锁,总的分3大模块来讲. 1.Redisson实现分布式锁原理 2.Redisson实现分布式锁的源码解析 3.Redi ...

  6. 利用Redisson实现分布式锁及其底层原理解析

    Redis介绍 参考地址:https://blog.csdn.net/turbo_zone/article/details/83422215 redis是一个key-value存储系统.和Memcac ...

  7. 【高并发】你知道吗?大家都在使用Redisson实现分布式锁了!!

    写在前面 忘记之前在哪个群里有朋友在问:有出分布式锁的文章吗-@冰河?我的回答是:这周会有,也是[高并发]专题的.想了想,还是先发一个如何使用Redisson实现分布式锁的文章吧?为啥?因为使用Red ...

  8. Redisson 实现分布式锁的原理分析

    写在前面 在了解分布式锁具体实现方案之前,我们应该先思考一下使用分布式锁必须要考虑的一些问题.​ 互斥性:在任意时刻,只能有一个进程持有锁. 防死锁:即使有一个进程在持有锁的期间崩溃而未能主动释放锁, ...

  9. spring boot:用redis+redisson实现分布式锁(redisson3.11.1/spring boot 2.2)

    一,为什么要使用分布式锁? 如果在并发时锁定代码的执行,java中用synchronized锁保证了线程的原子性和可见性 但java锁只在单机上有效,如果是多台服务器上的并发访问,则需要使用分布式锁, ...

  10. 冷饭新炒:理解Redisson中分布式锁的实现

    前提 在很早很早之前,写过一篇文章介绍过Redis中的red lock的实现,但是在生产环境中,笔者所负责的项目使用的分布式锁组件一直是Redisson.Redisson是具备多种内存数据网格特性的基 ...

随机推荐

  1. RF和adaboost

    通过对所有的决策树进行加总来预测新的数据(在分类时采用多数投票,在回归时采用平均).

  2. HDU 2822

    Dogs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. sad 关于一些html5新属性还需要用https才能支持

    像我昨天在搞一个录音的小东西 在本地正常录音正常播放 但是放到线上环境http环境上就出现了如上的错误 功能都不能正常使用 然后就改成https线上环境  然后就正常了 如上 大家有什么赐教的欢迎留言 ...

  4. Windows内核分析——内核调试机制的实现(NtCreateDebugObject、DbgkpPostFakeProcessCreateMessages、DbgkpPostFakeThreadMessages分析)

    本文主要分析内核中与调试相关的几个内核函数. 首先是NtCreateDebugObject函数,用于创建一个内核调试对象,分析程序可知,其实只是一层对ObCreateObject的封装,并初始化一些结 ...

  5. SICP第三章题解

    目录 SICP第三章题解 ex3-17 ex3-18 ex3-19 队列 ex3-21 ex3-22 ex3-24 ex3-25 3.4 并发:时间是一个本质问题 ex3-38 3.4.2 控制并发的 ...

  6. ros nodelet 使用

    ros nodelet能够加快高吞吐量程序运行速度比如点云 基本入门程序可以看 http://wiki.ros.org/nodelet/Tutorials/Porting%20nodes%20to%2 ...

  7. Python 3.6安装教程

    0x01 安装Python 1.1 说明 目前,Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的. 本教程安装的是python-3.6.1-amd64版本. Python官 ...

  8. php将长字符串拆分为指定最大宽度的字符串数组

    /** * 将字符串拆分为指定最大宽度的字符串数组.单字节字符宽度为1,多字节字符通常宽度为2 * @param string $msg 要拆分的字符串 * @param int $width 结果数 ...

  9. phpstorm+xdebug远程调试设置

    1 xdebug扩展安装 1.1 xdebug扩展安装: 2 服务器PHP配置 3 phpstorm设置 3.1 添加远程debug 3.2 phpstorm设置: 4 浏览器插件安装 4.1 chr ...

  10. 使用抽象bean

    定义抽象类Abstract=“true”抽象bean不能实例化,一个类可以创建多个bean. 抽象bean的配置和一般bean的配置基本一样只是在增加了Abstract=“true”抽象bean是一个 ...