百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

Redisson分布式锁的小总结(redis分布式锁的使用场景)

ztj100 2024-11-04 15:15 32 浏览 0 评论

学习官方权威文档

其实只要看完官方文档网上99%的内容都不用看了,包括下面的内容。

Redisson提供的锁

Redisson中最常用的是可重入锁re-entrant Lock也提供了其他的各种锁实现联锁(MultiLock),读写锁(ReadWriteLock),公平锁(Fair Lock),信号量(Semaphore),可过期性信号量(PermitExpirableSemaphore)和闭锁(CountDownLatch)redisson实现上使用lua脚本保障加锁和释放锁的原子性。

getLock

redisson提供的RLock,继承了JUC包的Lock。也就是说我们可以像使用JUC的lock一样使用RLock。使用方法一样,只是RLock是分布式锁。lock.lock()和lock(long leaseTime, TimeUnit unit)区别:无参的lock(), 会使用默认的锁超时时间30秒。redisson内部会使用看门狗机制自动进行续期,续期时间是三分之一的锁超时时间即10s。也就是说在锁的ttl到20s时,如果业务还没有执行完,redisson会自动发请求给redis,将锁的key过期时间设置为30s这就是redisson的自动续期。lock(long leaseTime, TimeUnit unit)要注意的是,我们自己设置了过期时间之后。redisson不会再自动续期。

建议的用法:

RLock lock = redisson.getLock(lockKey);
try {
  // 设置锁过期时间
  lock.lock(30, TimeUnit.SECONDS);
  // 业务操作
} catch (Exception ex) {
  ex.printStackTrace();
} finally {
  if (lock.isLocked()) {
      lock.unlock();
  }
}

为什么还是建议使用这种不会自动续期的用法呢?因为如果一个业务要执行超过10s,那么大概率是出了异常。比如数据库连不上了等等。这个时候不断续期,也解决不了问题。反而不断堆积请求。所以我们还是自己设置锁时间,只是把锁过期时间设的稍微长点,最好比99%的业务场景都长一点。另外,如果同步的代码时间超过10s,我们绝对要分析代码写的是不是有问题,加锁的代码段是不是过长。

还有个lock.tryLock方法,tryLock是成功和不成功都会立刻返回。lock.lock会等待获取锁。对应的,boolean tryLock(long waitTime, long leaseTime, TimeUnit unit)也有一个带参数的方法。可以设置等待多长时间获取锁。

  • getLock获取的锁是非公平锁
  • getFairLock获取的是公平锁
  • 读写锁

    RReadWriteLock rwlock = redisson.getReadWriteLock("myLock");
    
    RLock lock = rwlock.readLock();
    // or
    RLock lock = rwlock.writeLock();
    
    // traditional lock method
    lock.lock();

    并发读,排他写。补充说明,如果当前是写锁,那么读锁必须等待。这个很好理解。 如果当前是读锁。写锁也必须等待。 如果当前是读锁,其他的读操作可并发进行。

    信号量

    加一减一操作

      RSemaphore semaphore = redisson.getSemaphore("mySemaphore");
     
      // acquire single permit
      semaphore.acquire();
     
      // or acquire 10 permits
      semaphore.acquire(10);
     
      // or try to acquire permit
      boolean res = semaphore.tryAcquire();
     
      // or try to acquire permit or wait up to 15 seconds
      boolean res = semaphore.tryAcquire(15, TimeUnit.SECONDS);
     
      // or try to acquire 10 permit
      boolean res = semaphore.tryAcquire(10);
     
      // or try to acquire 10 permits or wait up to 15 seconds
      boolean res = semaphore.tryAcquire(10, 15, TimeUnit.SECONDS);
      if (res) {
        try {
          ...
        } finally {
            semaphore.release();
        }
      }

    闭锁CountDownLatch

    用法举例:

      RCountDownLatch latch = redisson.getCountDownLatch("myCountDownLatch");
     
      latch.trySetCount(5);
      // await for count down
      latch.await();
     
      // in other thread or JVM
      RCountDownLatch latch = redisson.getCountDownLatch("myCountDownLatch");
      latch.countDown();

    和juc中用法一样

    相关推荐

    Jquery 详细用法

    1、jQuery介绍(1)jQuery是什么?是一个js框架,其主要思想是利用jQuery提供的选择器查找要操作的节点,然后将找到的节点封装成一个jQuery对象。封装成jQuery对象的目的有...

    前端开发79条知识点汇总

    1.css禁用鼠标事件2.get/post的理解和他们之间的区别http超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信。HTTP的工作方式是客户机与服务器之间的请求-应答协议。...

    js基础面试题92-130道题目

    92.说说你对作用域链的理解参考答案:作用域链的作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到window对象即被终止,作用域链向下访问变量是不被允许的。...

    Web前端必备基础知识点,百万网友:牛逼

    1、Web中的常见攻击方式1.SQL注入------常见的安全性问题。解决方案:前端页面需要校验用户的输入数据(限制用户输入的类型、范围、格式、长度),不能只靠后端去校验用户数据。一来可以提高后端处理...

    事件——《JS高级程序设计》

    一、事件流1.事件流描述的是从页面中接收事件的顺序2.事件冒泡(eventbubble):事件从开始时由最具体的元素(就是嵌套最深的那个节点)开始,逐级向上传播到较为不具体的节点(就是Docu...

    前端开发中79条不可忽视的知识点汇总

    过往一些不足的地方,通过博客,好好总结一下。1.css禁用鼠标事件...

    Chrome 开发工具之Network

    经常会听到比如"为什么我的js代码没执行啊?","我明明发送了请求,为什么反应?","我这个网站怎么加载的这么慢?"这类的问题,那么问题既然存在,就需要去解决它,需要解决它,首先我们得找对导致问题的原...

    轻量级 React.js 虚拟美化滚动条组件RScroll

    前几天有给大家分享一个Vue自定义滚动条组件VScroll。今天再分享一个最新开发的ReactPC端模拟滚动条组件RScroll。...

    一文解读JavaScript事件对象和表单对象

    前言相信做网站对JavaScript再熟悉不过了,它是一门脚本语言,不同于Python的是,它是一门浏览器脚本语言,而Python则是服务器脚本语言,我们不光要会Python,还要会JavaScrip...

    Python函数参数黑科技:*args与**kwargs深度解析

    90%的Python程序员不知道,可变参数设计竟能决定函数的灵活性和扩展性!掌握这些技巧,让你的函数适应任何场景!一、函数参数设计的三大进阶技巧...

    深入理解Python3密码学:详解PyCrypto库加密、解密与数字签名

    在现代计算领域,信息安全逐渐成为焦点话题。密码学,作为信息保护的关键技术之一,允许我们加密(保密)和解密(解密)数据。...

    阿里Nacos惊爆安全漏洞,火速升级!(附修复建议)

    前言好,我是threedr3am,我发现nacos最新版本1.4.1对于User-Agent绕过安全漏洞的serverIdentitykey-value修复机制,依然存在绕过问题,在nacos开启了...

    Python模块:zoneinfo时区支持详解

    一、知识导图二、知识讲解(一)zoneinfo模块概述...

    Golang开发的一些注意事项(一)

    1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...

    Python鼠标与键盘自动化指南:从入门到进阶——键盘篇

    `pynput`是一个用于控制和监控鼠标和键盘的Python库...

    取消回复欢迎 发表评论: