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

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

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

    相关推荐

    从IDEA开始,迈进GO语言之门(idea got)

    前言笔者在学习GO语言编程的时候,GO语言在国内还没有像JAVA/Php/Python那样普及,绕了不少的弯路,要开始入门学习一门编程语言,最好就先从选择一个好的编程语言的开发环境开始,有了这个开发环...

    基于SpringBoot+MyBatis的私人影院java网上购票jsp源代码Mysql

    本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于SpringBoot...

    基于springboot的个人服装管理系统java网上商城jsp源代码mysql

    本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于springboot...

    基于springboot的美食网站Java食品销售jsp源代码Mysql

    本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于springboot...

    贸易管理进销存springboot云管货管账分析java jsp源代码mysql

    本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目描述贸易管理进销存spring...

    SpringBoot+VUE员工信息管理系统Java人员管理jsp源代码Mysql

    本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍SpringBoot+V...

    目前见过最牛的一个SpringBoot商城项目(附源码)还有人没用过吗

    帮粉丝找了一个基于SpringBoot的天猫商城项目,快速部署运行,所用技术:MySQL,Druid,Log4j2,Maven,Echarts,Bootstrap...免费给大家分享出来前台演示...

    SpringBoot+Mysql实现的手机商城附带源码演示导入视频

    今天为大家带来的是基于SpringBoot+JPA+Thymeleaf框架的手机商城管理系统,商城系统分为前台和后台、前台用的是Bootstrap框架后台用的是SpringBoot+JPA都是现在主...

    全网首发!马士兵内部共享—1658页《Java面试突击核心讲》

    又是一年一度的“金九银十”秋招大热门,为助力广大程序员朋友“面试造火箭”,小编今天给大家分享的便是这份马士兵内部的面试神技——1658页《Java面试突击核心讲》!...

    SpringBoot数据库操作的应用(springboot与数据库交互)

    1.JDBC+HikariDataSource...

    SpringBoot 整合 Flink 实时同步 MySQL

    1、需求在Flink发布SpringBoot打包的jar包能够实时同步MySQL表,做到原表进行新增、修改、删除的时候目标表都能对应同步。...

    SpringBoot + Mybatis + Shiro + mysql + redis智能平台源码分享

    后端技术栈基于SpringBoot+Mybatis+Shiro+mysql+redis构建的智慧云智能教育平台基于数据驱动视图的理念封装element-ui,即使没有vue的使...

    Springboot+Mysql舞蹈课程在线预约系统源码附带视频运行教程

    今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的Springboot+Mysql舞蹈课程在线预约系统,系统项目源代码在【猿来入此】获取!https://www.yuan...

    SpringBoot+Mysql在线众筹系统源码+讲解视频+开发文档(参考论文

    今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的在线众筹管理系统,主要实现了普通用户在线参与众筹基本操作流程的全部功能,系统分普通用户、超级管理员等角色,除基础脚手架外...

    Docker一键部署 SpringBoot 应用的方法,贼快贼好用

    这两天发现个Gradle插件,支持一键打包、推送Docker镜像。今天我们来讲讲这个插件,希望对大家有所帮助!GradleDockerPlugin简介...

    取消回复欢迎 发表评论: