首页 > 数据库 >Redisson与分布式锁

Redisson与分布式锁

时间:2024-09-25 22:15:28浏览次数:8  
标签:10 Redisson lock redis 看门狗 分布式

一. Redis的常用客户端:

  1. Jedis:和命令最相似,API全面。缺点:多线程不安全(多线程可以使用连接池,安全使用Jedis)
  2. SpringData:线程安全的,底层基于Netty(异步的支持)
  3. Redisson:线程安全的,底层基于Netty,提供很多的分布式服务(分布式锁,分布式集合,分布式下的JUC的封装,延时队列)

二. Redis实现分布式锁
分布式锁和本地锁本质是一样的,都是将并行的操作转换为串行的操作。

  • 实现过程:
    • 利用setnx互斥性
    • 加入TTL防止死锁问题
    • 注意使用LUA脚本确保原子性
    • 加入看门狗,防止业务拿锁时间过长导致的锁失效问题(业务拿锁时间>TTL)

如果担心应用先释放锁,再加锁,再释放锁,这样做
释放锁时候,要判断只有持有锁的线程才能释放锁,需要通过本地存储的唯一性ID和redis中写入的ID。那么有两步,拿redis里ID,然后判断,所以需要使用LUA脚本保证原子性。

三. Redisson实现分布式锁
Redisson的分布式锁默认有看门狗,必须无参数方法(lock.lock()方式,这种redis的TTL默认30秒,默认10秒运行一次)。
有time参数的方法这个看门狗会失效,因为看门狗本身是一个定时任务。
如果加了参数的方法,可以判断处理业务的时间,如果>time,则可以回滚抛出异常,因为业务处理异常了。

RLock lock = redisson.getLock("myLock");
// traditional lock method
lock.lock();
// or acquire lock and automatically unlock it after 10 seconds
lock.lock(10, TimeUnit.SECONDS);
// or wait for lock aquisition up to 100 seconds 
// and automatically unlock it after 10 seconds
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);if (res) {
   try {
     ...
   } finally {
       lock.unlock();
   }
}

另外:
批量+多线程容易死锁,可以用redis的set集合,做交集

四. Redis常见的解决方案:

  1. 可以做分布式限流。
    实现:
    a.写一个lua脚本,如果key不存在,则incr +ttl 60s
    b.如果key存在,则只执行incr
    c.再写一个判断,是否被限制的lua脚本,获取value,get value >200,返回false,否则返回true
    d.Redisson中提供了一个RateLimiter专门做限流
  2. Redis可以做信号量+分布式锁

标签:10,Redisson,lock,redis,看门狗,分布式
From: https://www.cnblogs.com/chengdanally/p/18426645

相关文章

  • 学习《分布式》必须清楚的《CAP理论》
    分布式的理论基础CAP理论当学习分布式的redis、mq等中间件时,都会看到有提到CAP。CAP理论是学习分布式必备的一个概念知识点。CAP理论由三个特性组成,分别是一致性(Consistency)、可用性(Availability)、分区容错性(PartitionTolerance)。注意:一般的分布式的系统服务或中间件,......
  • 这10种分布式ID,太绝了!
    这10种分布式ID,太绝了! 前言分布式ID,在我们日常的开发中,其实使用的挺多的。有很多业务场景在用,比如:分布式链路系统的trace_id单表中的主键Redis中分布式锁的key分库分表后表的id今天跟大家一起聊聊分布式ID的一些常见方案,希望对你会有所帮助。1UUIDUUID(Univers......
  • Nginx 在处理大规模分布式系统时有哪些性能优化技巧?
    在处理大规模分布式系统时,Nginx可以通过多种方式进行性能优化。以下是一些有效的性能优化技巧:优化Worker进程与连接数:根据服务器的CPU核数设置worker_processes参数,通常设置为自动检测或等于CPU核心数。调整worker_connections参数,以确定每个worker进程能处理的最大连......
  • 探索分布式IO模块的介质冗余:赋能工业自动化的稳健之心
    在日新月异的工业自动化领域,每一个细微环节的稳定性都直接关系到生产线的效率与安全。随着智能制造的深入发展,分布式IO(Input/Output)模块作为连接现场设备与控制系统的关键桥梁,其重要性日益凸显。明达技术自主研发的带有介质冗余功能的MR30分布式IO模块,正以其独特的优势,为工业自动化......
  • 分布式环境中,接口超时重试带来的的幂等问题如何解决?
    目录标题幂等不能解决接口超时吗?幂等的重要性什么是幂等?为什么需要幂等?接口超时了,到底如何处理?如何设计幂等?幂等设计的基本流程实现幂等的8种方案1.select+insert+主键/唯一索引冲突(常用)2.直接insert+主键/唯一索引冲突3.状态机幂等(常用)4.抽取防重表5.token令牌(前......
  • 面试官:项目中如何实现分布式锁?
    分布式锁(DistributedLock)是一种用于分布式系统中的同步机制,主要是为了防止分布式系统中,多个服务实例同时操作一个共享资源所带来的并发安全问题。分布式锁确保在同一时间只有一个实例操作共享资源,从而保证了数据的安全性。1.分布式锁实现方案分布式锁的实现方案有多种,例如以......
  • EtherCAT(以太网控制自动化技术)协议以其高带宽、低延迟特性,在工业自动化领域占据重要地
    一、MR30分布式IO模块概述EtherCAT(以太网控制自动化技术)协议以其高带宽、低延迟特性,在工业自动化领域占据重要地位。明达技术自主研发的MR30分布式IO模块作为EtherCAT协议的杰出应用,集成了多种输入输出功能,通过EtherCAT总线实现与主站的高效通信与控制,为纸巾包装行业带来革新。二、......
  • 分布式锁实现
            在SpringBoot项目中,实现分布式锁可以通过多种方式,常见的有使用Redis、数据库等。以下是通过Redis和数据库两种方式来实现分布式锁的示例。1、使用Redis实现分布式锁        Redis提供了简单且高效的分布式锁机制。可以使用SETNX命令(setIf......
  • 在 Go 语言中使用 Redis 实现分布式锁
    目录在Go语言中使用Redis实现分布式锁一、分布式锁的概念和作用二、Redis实现分布式锁的原理三、在Go语言中使用Redis实现分布式锁的步骤(一)安装Redis客户端库(二)定义分布式锁结构体(三)实现获取锁的方法(四)实现释放锁的方法(五)使用分布式锁四、注意事项五、总......
  • redisson内存泄漏问题排查
    问题描述最近生产有个服务突然出现频繁告警,接口P99响应时间变长,运维同学观察到相应的podcpu飙升,内存占用很高。cpu升高问题排查是老生常谈的话题了,一般可以使用top-ppid-H查看是哪个线程占用cpu高,再结合jstack找到对应的java线程代码。不过经验告诉我们,cpu升高还有另外一个......