爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      Redisson中的“琐事”

      首页 知识中心 软件开发 文章详情页

      Redisson中的“琐事”

      2023-06-12 09:25:54 阅读次数:472

      redis,线程,锁

      前言

      在应用开发中,特别是web工程开发,通常都是并发编程,不是多进程就是多线程。这种场景下极易出现线程并发性安全问题,此时不得不使用锁来解决问题。在多线程高并发场景下,为了保证资源的线程安全问题,jdk为我们提供了synchronized关键字和ReentrantLock可重入锁,但是它们只能保证一个工程内的线程安全。在分布式集群、微服务、云原生横行的当下,如何保证不同进程、不同服务、不同机器的线程安全问题,jdk并没有给我们提供既有的解决方案。此时,我们就必须借助于相关技术手动实现了。目前主流的实现有以下方式:

      1. 基于mysql关系型实现
      2. 基于redis非关系型数据实现
      3. 基于zookeeper/etcd实现

      Redisson中的“琐事”

      锁分类

      悲观锁:具有强烈的独占和排他特性,在整个数据处理过程中,将数据处于锁定状态。适合于写比较多,会阻塞读操作。
      乐观锁:采取了更加宽松的加锁机制,大多是基于数据版本( Version )及时间戳来实现。。适合于读比较多,不会阻塞读

      独占锁、互斥锁、排他锁:保证在任一时刻,只能被一个线程独占排他持有。synchronized、ReentrantLock
      共享锁:可同时被多个线程共享持有。CountDownLatch倒计数器、Semaphore信号量

      可重入锁:又名递归锁。同一个线程在外层方法获取锁的时候,在进入内层方法时会自动获取锁。
      不可重入锁:

      公平锁:有优先级的锁,先来先得,谁先申请锁就先获取到锁
      非公平锁:无优先级的锁,后来者也有机会先获取到锁

      自旋锁:当线程尝试获取锁失败时(锁已经被其它线程占用了),无限循环重试尝试获取锁
      阻塞锁:当线程尝试获取锁失败时,线程进入阻塞状态,直到接收信号后被唤醒。在竞争激烈情况下,性能较高

      读锁:共享锁
      写锁:独占排他锁

      偏向锁:一直被一个线程所访问,那么该线程会自动获取锁
      轻量级锁(CAS):当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,
      其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。
      重量级锁:当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候(10次),
      还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。重量级锁会让他申请的线程进入阻塞,性能降低。
      以上其实是synchronized的锁升级过程

      表级锁:对整张表加锁,加锁快开销小,不会出现死锁,但并发度低,会增加锁冲突的概率
      行级锁:是mysql粒度最小的锁,只针对操作行,可大大减少锁冲突概率,并发度高,但加锁慢,开销大,会出现死锁

      Redisson

      ​​Redisson​​是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service) Redisson提供了使用Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。

      Redisson中的“琐事”

      ​​Redisson​​​底层采用的是​​Netty​​​ 框架。支持​​Redis 2.8​​​以上版本,支持​​Java1.6+​​以上版本。

      可重入锁(Reentrant Lock)

      基于Redis的Redisson分布式可重入锁​​RLock​​​ Java对象实现了​​java.util.concurrent.locks.Lock​​接口。

      如果负责储存这个分布式锁的Redisson节点宕机以后,而且这个锁正好处于锁住的状态时,这个锁会出现锁死的状态。为了避免这种情况的发生,Redisson内部提供了一个监控锁的看门狗(timer定时器),它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。默认情况下,看门狗检查锁的超时时间是30秒钟,也可以通过修改​​Config.lockWatchdogTimeout​​来另行指定。

      ​​RLock​​​对象完全符合Java的Lock规范。也就是说只有拥有锁的进程才能解锁,其他进程解锁则会抛出​​IllegalMonitorStateException​​错误。

      另外Redisson还通过加锁的方法提供了​​leaseTime​​的参数来指定加锁的时间。超过这个时间后锁便自动解开了。

      RLock lock = redisson.getLock("anyLock");
      // 最常见的使用方法
      lock.lock();

      // 加锁以后10秒钟自动解锁
      // 无需调用unlock方法手动解锁
      lock.lock(10, TimeUnit.SECONDS);

      // 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
      boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
      if (res) {
      try {
      ...
      } finally {
      lock.unlock();
      }
      }

      1、引入依赖

      <dependency>
      <groupId>org.redisson</groupId>
      <artifactId>redisson</artifactId>
      <version>3.11.2</version>
      </dependency>

      2、添加配置

      @Configuration
      public class RedissonConfig {

      @Bean
      public RedissonClient redissonClient(){
      Config config = new Config();
      // 可以用"rediss://"来启用SSL连接
      config.useSingleServer().setAddress("redis://127.0.0.1:6379");
      return Redisson.create(config);
      }
      }

      3、代码中使用

      @Autowired
      private RedissonClient redissonClient;

      public void checkAndLock() {
      // 加锁,获取锁失败重试
      RLock lock = this.redissonClient.getLock("lock");
      lock.lock();

      // todo 一些处理业务

      // 释放锁
      lock.unlock();
      }

      公平锁(Fair Lock)

      基于Redis的Redisson分布式可重入公平锁也是实现了​​java.util.concurrent.locks.Lock​​​接口的一种​​RLock​​​对象。同时还提供了​​异步(Async)​​​、​​反射式(Reactive)​​​和​​RxJava2标准​​的接口。它保证了当多个Redisson客户端线程同时请求加锁时,优先分配给先发出请求的线程。所有请求线程会在一个队列中排队,当某个线程出现宕机时,Redisson会等待5秒后继续下一个线程,也就是说如果前面有5个线程都处于等待状态,那么后面的线程会等待至少25秒。

      可重入锁拼的是运气,先到的请求不一定会先抢到锁
      公平锁拼的是网速和手速,内部会有一个队列来保证顺序

      RLock fairLock = redisson.getFairLock("anyLock");
      // 最常见的使用方法
      fairLock.lock();

      // 10秒钟以后自动解锁
      // 无需调用unlock方法手动解锁
      fairLock.lock(10, TimeUnit.SECONDS);

      // 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
      boolean res = fairLock.tryLock(100, 10, TimeUnit.SECONDS);
      fairLock.unlock();

      联锁(MultiLock)

      基于Redis的Redisson分布式联锁​​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);
      // 同时加锁:lock1 lock2 lock3
      // 所有的锁都上锁成功才算成功。
      lock.lock();
      ...
      lock.unlock();

      红锁(RedLock)

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

      RLock lock1 = redissonInstance1.getLock("lock1");
      RLock lock2 = redissonInstance2.getLock("lock2");
      RLock lock3 = redissonInstance3.getLock("lock3");

      RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);
      // 同时加锁:lock1 lock2 lock3
      // 红锁在大部分节点上加锁成功就算成功。
      lock.lock();
      ...
      lock.unlock();

      读写锁(ReadWriteLock)

      基于Redis的Redisson分布式可重入读写锁​​RReadWriteLock​​​ Java对象实现了​​java.util.concurrent.locks.ReadWriteLock​​​接口。其中读锁和写锁都继承了​​RLock​​接口。

      分布式可重入读写锁允许同时有多个读锁和一个写锁处于加锁状态。

      RReadWriteLock rwlock = redisson.getReadWriteLock("anyRWLock");
      // 最常见的使用方法
      rwlock.readLock().lock();
      // 或
      rwlock.writeLock().lock();

      // 10秒钟以后自动解锁
      // 无需调用unlock方法手动解锁
      rwlock.readLock().lock(10, TimeUnit.SECONDS);
      // 或
      rwlock.writeLock().lock(10, TimeUnit.SECONDS);

      // 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
      boolean res = rwlock.readLock().tryLock(100, 10, TimeUnit.SECONDS);
      // 或
      boolean res = rwlock.writeLock().tryLock(100, 10, TimeUnit.SECONDS);
      ...
      lock.unlock();

      并发操作

      是否可以并发

      写 和 写

      不能并发

      读 和 写

      不能并发

      读 和 读

      可以并发

      信号量(Semaphore)

      基于Redis的Redisson的分布式信号量(​​Semaphore​​​)Java对象​​RSemaphore​​​采用了与​​java.util.concurrent.Semaphore​​​相似的接口和用法。同时还提供了​​异步(Async)​​​、​​反射式(Reactive)​​​和​​RxJava2标准​​的接口。

      RSemaphore semaphore = redisson.getSemaphore("semaphore");
      semaphore.trySetPermits(3);
      //尝试获取许可,如果成功就会继续执行,否则就会被阻塞
      semaphore.acquire();
      //释放许可供其他线程使用,之前被阻塞的线程会被唤醒继续执行
      semaphore.release();

      ​​Semaphore​​一般用于流量的控制,特别是公共资源有限的应用场景。例如数据库的连接,假设数据库的连接数上线为10个,多个线程并发操作数据库可以使用Semaphore来控制并发操作数据库的线程个数最多为10个。

      例如商场的停车场只有三个车位,外边有十辆车需要进来,这时要保证同一时刻停车场只能有三辆车进来,有空车位了才能让别的车驶进来。

      闭锁(CountDownLatch)

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

      RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");
      latch.trySetCount(1);
      latch.await();

      // 在其他线程或其他JVM里
      RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");
      latch.countDown();

      ​​JUC​​​中的​​CountDownLatch​​作用只能局限在单个JVM中,一旦集群部署的话就无法保证了

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/u_14452299/6019753,作者:鱼找水需要时间,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:将应用程序注册为Linux系统服务,并设置开机自启动

      下一篇:SpringBoot-技术专区-Redis同数据源动态切换db

      相关文章

      2025-05-16 09:15:17

      Linux系统基础-多线程超详细讲解(5)_单例模式与线程池

      Linux系统基础-多线程超详细讲解(5)_单例模式与线程池

      2025-05-16 09:15:17
      单例 , 线程 , 队列
      2025-05-14 10:07:38

      超级好用的C++实用库之互斥锁

      互斥锁是一种用于多线程编程的同步机制,其主要目的是确保在并发执行环境中,同一时间内只有一个线程能够访问和修改共享资源。

      2025-05-14 10:07:38
      CHP , Lock , 互斥 , 线程 , 释放 , 锁定
      2025-05-14 10:03:13

      超级好用的C++实用库之线程基类

      在C++中,线程是操作系统能够进行运算调度的最小单位。一个进程可以包含多个线程,这些线程共享进程的资源,比如:内存空间和系统资源,但它们有自己的指令指针、堆栈和局部变量等。

      2025-05-14 10:03:13
      Linux , void , Windows , 函数 , 操作系统 , 线程
      2025-05-14 10:02:48

      互斥锁解决redis缓存击穿

      在高并发系统中,Redis 缓存是一种常见的性能优化方式。然而,缓存击穿问题也伴随着高并发访问而来。

      2025-05-14 10:02:48
      Redis , 互斥 , 数据库 , 线程 , 缓存 , 请求
      2025-05-14 09:51:15

      java怎么对线程池做监控

      对Java线程池进行监控是确保系统性能和稳定性的重要部分。监控线程池可以帮助我们了解线程池的状态,如当前活跃线程数、任务队列长度、已完成任务数等。

      2025-05-14 09:51:15
      Java , 方法 , 监控 , 示例 , 线程 , 队列
      2025-05-12 08:40:18

      如何向线程传递参数

      如何向线程传递参数

      2025-05-12 08:40:18
      传递 , 参数 , 封装 , 开启 , 线程
      2025-05-09 08:51:21

      notify和notifyall的区别

      notify和notifyall的区别

      2025-05-09 08:51:21
      notify , synchronized , 方法 , 线程 , 调用 , 释放
      2025-05-09 08:51:09

      Java之线程同步(同步方法、同步代码块)(关键字synchronized)(案例分析)

      多线程的并发执行可以提高程序的效率。但是多个线程访问共享资源时,会引发一些安全问题。

      2025-05-09 08:51:09
      代码 , 同步 , 执行 , 方法 , 线程
      2025-05-07 09:08:23

      Qt中线程的使用

      在qt中线程的使用有两种方式,第一种就是创建一个类继承QObject类,之后使用moveToThread函数将线程添加到类中。另一种就是创建一个类继承QThread类,在类中实现run函数。

      2025-05-07 09:08:23
      run , 使用 , 函数 , 线程
      2025-05-06 09:19:12

      redis高可用集群搭建

      redis高可用集群搭建

      2025-05-06 09:19:12
      master , redis , 服务器 , 节点 , 集群
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5248447

      查看更多

      最新文章

      Linux系统基础-多线程超详细讲解(5)_单例模式与线程池

      2025-05-16 09:15:17

      超级好用的C++实用库之互斥锁

      2025-05-14 10:07:38

      超级好用的C++实用库之线程基类

      2025-05-14 10:03:13

      互斥锁解决redis缓存击穿

      2025-05-14 10:02:48

      java怎么对线程池做监控

      2025-05-14 09:51:15

      如何向线程传递参数

      2025-05-12 08:40:18

      查看更多

      热门文章

      Java线程同步synchronized wait notifyAll

      2023-04-18 14:15:05

      (五)高并发redis学习笔记:RDB和AOF两种持久性机制的介绍以及优缺点对比

      2023-06-07 07:30:42

      (七)高并发redis学习笔记:redis的AOF持久化机制深入理解以及数据恢复实验

      2023-06-07 07:30:42

      Android Priority Job Queue (Job Manager):线程任务的容错重启机制(二)

      2024-09-25 10:13:46

      操作系统中的线程种类

      2023-04-24 11:27:18

      Android Priority Job Queue (Job Manager):多重不同Job并发执行并在前台获得返回结果(四)

      2023-04-13 09:54:33

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      Java多线程编程:线程生命周期、同步机制等

      【MySQL】线程状态详解

      踩坑之RedisTemplate执行Lua脚本

      CUDA从入门到精通(三)——CUDA编程示例

      阻塞与唤醒:多线程编程的神秘面纱

      redis 6.0源码安装

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号