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

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

ztj100 2024-11-04 15:15 27 浏览 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中用法一样

    相关推荐

    再说圆的面积-蒙特卡洛(蒙特卡洛方法求圆周率的matlab程序)

    在微积分-圆的面积和周长(1)介绍微积分方法求解圆的面积,本文使用蒙特卡洛方法求解圆面积。...

    python编程:如何使用python代码绘制出哪些常见的机器学习图像?

    专栏推荐...

    python创建分类器小结(pytorch分类数据集创建)

    简介:分类是指利用数据的特性将其分成若干类型的过程。监督学习分类器就是用带标记的训练数据建立一个模型,然后对未知数据进行分类。...

    matplotlib——绘制散点图(matplotlib散点图颜色和图例)

    绘制散点图不同条件(维度)之间的内在关联关系观察数据的离散聚合程度...

    python实现实时绘制数据(python如何绘制)

    方法一importmatplotlib.pyplotaspltimportnumpyasnpimporttimefrommathimport*plt.ion()#...

    简单学Python——matplotlib库3——绘制散点图

    前面我们学习了用matplotlib绘制折线图,今天我们学习绘制散点图。其实简单的散点图与折线图的语法基本相同,只是作图函数由plot()变成了scatter()。下面就绘制一个散点图:import...

    数据分析-相关性分析可视化(相关性分析数据处理)

    前面介绍了相关性分析的原理、流程和常用的皮尔逊相关系数和斯皮尔曼相关系数,具体可以参考...

    免费Python机器学习课程一:线性回归算法

    学习线性回归的概念并从头开始在python中开发完整的线性回归算法最基本的机器学习算法必须是具有单个变量的线性回归算法。如今,可用的高级机器学习算法,库和技术如此之多,以至于线性回归似乎并不重要。但是...

    用Python进行机器学习(2)之逻辑回归

    前面介绍了线性回归,本次介绍的是逻辑回归。逻辑回归虽然名字里面带有“回归”两个字,但是它是一种分类算法,通常用于解决二分类问题,比如某个邮件是否是广告邮件,比如某个评价是否为正向的评价。逻辑回归也可以...

    【Python机器学习系列】拟合和回归傻傻分不清?一文带你彻底搞懂

    一、拟合和回归的区别拟合...

    推荐2个十分好用的pandas数据探索分析神器

    作者:俊欣来源:关于数据分析与可视化...

    向量数据库:解锁大模型记忆的关键!选型指南+实战案例全解析

    本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...

    用Python进行机器学习(11)-主成分分析PCA

    我们在机器学习中有时候需要处理很多个参数,但是这些参数有时候彼此之间是有着各种关系的,这个时候我们就会想:是否可以找到一种方式来降低参数的个数呢?这就是今天我们要介绍的主成分分析,英文是Princip...

    神经网络基础深度解析:从感知机到反向传播

    本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...

    Python实现基于机器学习的RFM模型

    CDA数据分析师出品作者:CDALevelⅠ持证人岗位:数据分析师行业:大数据...

    取消回复欢迎 发表评论: