一、防重情况一:并发情况下只有一个执行,但串行情况(使用线程池)下可以执行多次
RLock rLock = redissonClient.getLock("key-"+msgId); boolean getLock = false; try { if(rLock.tryLock(5,60 * 60 * 24 * 7, TimeUnit.SECONDS)){ getLock = true; this.doBusiness(msgBo,msgId); }else{ log.warn("can not lock:{}",msgId); } } catch (Exception e) { log.error("deal error,msgId={}",msgId,e); //当前业务处理失败,释放锁 if(rLock != null && rLock.isHeldByCurrentThread()){ rLock.unlock(); } throw new RuntimeException(e); } if(!getLock){ throw new RuntimeException("can not get lock"); }
以上发生重复执行的原因,在于虽然设置了加锁时间7天,但如果使用的是线程池,可能后续同一线程消费MQ消息。所以能获取到分布式锁。
二、防重情况二:并发情况下只有一个执行,指定时间范围内不能再执行
String key = "key-"+msgId; boolean getLock = false; try{ if(redisClient.setNx(key,"Y",60*60*24*7)){ getLock = true; this.doBusiness(msgBo,msgId); }else{ log.warn("can not lock:{}",msgId); } }catch (Exception e) { log.error("deal error,msgId={}",msgId,e); //当前业务处理失败,释放锁 if(getLock){ Long delResult = redisClient.del(key); log.info("delResult = {}",delResult); } throw new RuntimeException(e); } if(!getLock){ throw new RuntimeException("can not get lock"); }
相关推荐
Java基于Redis实现分布式锁代码实例 分布式锁的必要性 在多线程环境中,资源竞争是一个常见的问题。例如,在一个简单的用户操作中,一个线程修改用户状态,首先在内存中读取用户状态,然后在内存中进行修改,然后...
本文将深入探讨如何使用Redis实现分布式锁,以及如何利用自旋式加锁和Lua脚本实现原子性解锁。 首先,我们来理解分布式锁的基本概念。分布式锁是在多节点之间共享资源时,用于协调各个节点的访问控制机制。在分布式...
redis实现分布式锁(java/jedis),其中包含工具方法以及使用demo 本资源是利用java的jedis实现 redis实现分布式锁(java/jedis),其中包含工具方法以及使用demo 本资源是利用java的jedis实现
本文将深入探讨如何使用C++结合Redis实现分布式锁,并详细讲解Redis API在C++中的应用,以及如何处理与Boost库的集成。 首先,Redis是一个高性能的键值存储数据库,广泛用于缓存、消息队列、分布式锁等场景。分布式...
在实际项目中,`redis实现分布式锁与java信号量.md`文件可能详细介绍了如何将这些理论知识应用到实际代码中,包括连接Redis、设置和获取锁、释放锁、异常处理等步骤。而`项目说明.zip`文件则可能包含了一个实际的...
Redis,作为一个高性能的键值存储系统,常被用于实现分布式锁,因为它提供了丰富的数据类型和原子操作。本教程将深入探讨如何利用Redis来构建分布式锁。 一、Redis分布式锁的优势 1. 响应速度:Redis是内存数据库...
本文将深入探讨如何利用Redis实现分布式锁,并对比其与信号量的区别。 一、Redis分布式锁 1. **基本原理**:在Redis中,分布式锁通常通过`SETNX`(Set if Not eXists)命令或者`SET`命令配合`nx`和`ex`选项来创建...
一、Redis实现分布式锁 1. Redis分布式锁的核心是`setnx()`命令,它用于设置键值对,但如果键已存在,则返回失败。在分布式锁的实现中,通常会为锁设置一个超时时间,以防锁意外丢失。例如,使用`Lock:order`作为锁...
本篇文章将深入探讨如何利用Redis实现分布式锁以及如何构建一个基于Redis的任务队列。 分布式锁是解决多节点共享资源时防止数据冲突的关键机制。在Go中,我们通常通过与Redis交互来实现这一功能。Redis提供了`SETNX...
Spring Boot 提供了与 Redis 集成的便捷方式,使得开发者能够快速实现分布式锁功能。本篇文章将详细讲解如何利用 Spring Boot 结合 Redis 实现分布式锁。 首先,理解分布式锁的基本概念。分布式锁是在分布式系统中...
首先,Redis作为一个内存数据库,其高速读写性能使其成为实现分布式锁的理想选择。分布式锁的主要作用是在多节点环境下保证同一时刻只有一个节点可以执行特定操作,避免并发问题。Redisson的分布式锁通过`RLock`接口...
分布式锁有很多种解决方案,今天我们要讲的是怎么使用缓存数据库Redis来实现分布式锁。 课程目标: 理解redis分布式锁的应用场景 掌握redis分布式锁的实现原理 掌握redis分布式锁在微服务项目中的应用 掌握...
Redis实现分布式锁主要依赖三个基本操作:`SETNX`(Set If Not eXists)、`EXPIRE` 和 `DEL`。 1. **`SETNX` 命令**:只有当键不存在时才设置键值,返回1表示设置成功,返回0表示键已存在,无法设置。 2. **`EXPIRE...
4. 性能与可用性:使用Redis实现分布式锁,可以保证很高的性能,因为Redis操作非常快速。同时,由于Redis支持主从复制和哨兵模式,提供了高可用性的保障。即便主节点不可用,通过故障转移,其他从节点可以迅速接管,...
读书笔记:架构实战篇十八Spring Boot Redis实现分布式锁
本篇文章将深入探讨如何在C#.NET环境下利用Redis实现分布式锁,以及相关的核心知识点。 首先,让我们理解什么是分布式锁。分布式锁是在分布式系统中,用于协调不同节点间对共享资源访问的一种工具。它确保在任何...
Redis,作为一种高性能的NoSQL数据库,因其支持原子操作和具备高可用性,成为实现分布式锁的理想选择。 文章指出,利用Redis的SET命令来实现锁机制是实现分布式锁的一个有效途径。SET命令在Redis中用于设置键值对,...
本文将深入探讨如何使用Go语言(Golang)和Redis来实现分布式锁,并介绍其中涉及到的关键概念和实现方式,包括看门狗(Watchdog)和红锁(RedLock)策略。 **一、Redis作为分布式锁** Redis因其高性能、轻量级以及...
不过,以上代码提供了一个基本的实现思路,帮助你理解如何在SpringBoot应用中使用Redis实现分布式锁。 通过提供的Word文档,你应该能够找到更详细的配置和使用步骤。记得在实际项目中根据具体需求进行调整,确保...