import org.apache.log4j.Logger; import com.sf.weplay.redis.RedisManager; public class Lock { //默认最长锁5分钟 private final static int EXPIRED_TIME = 300000; public static Logger logger = Logger.getLogger(Lock.class); /** * 锁 * @param lockName * @return true 成功/false 失败 */ public static boolean lock(String lockName) { return getLock(lockName, 0); } /** * 解除锁 * @param lockName * @return */ public static void unlock(String lockName) { RedisManager.redisManager.del(lockName); } private static boolean getLock(String lockName, Integer count) { long lockExpireTime = System.currentTimeMillis() + EXPIRED_TIME; String stringOfLockExpireTime = String.valueOf(lockExpireTime); boolean gotLock = false; if(count > 300) { return gotLock; } Long i = RedisManager.redisManager.setnx(lockName, stringOfLockExpireTime); if (i == 1) { gotLock = true; return gotLock; } String value = RedisManager.redisManager.get(lockName, String.class); if (value != null && isTimeExpired(value)){ value = RedisManager.redisManager.getSet(lockName, stringOfLockExpireTime); if (value != null && isTimeExpired(value)) { gotLock = true; return gotLock; } } try { Thread.sleep(200); } catch (InterruptedException e) { // 不处理异常睡眠异常 } return getLock(lockName, ++count); } private static boolean isTimeExpired(String value) { return Long.parseLong(value) < System.currentTimeMillis(); } }
相关推荐
Java基于Redis实现分布式锁代码实例 分布式锁的必要性 在多线程环境中,资源竞争是一个常见的问题。例如,在一个简单的用户操作中,一个线程修改用户状态,首先在内存中读取用户状态,然后在内存中进行修改,然后...
Redis作为一个高性能的键值存储系统,常被用作实现分布式锁的工具。本文将深入探讨如何使用Redis实现分布式锁,以及如何利用自旋式加锁和Lua脚本实现原子性解锁。 首先,我们来理解分布式锁的基本概念。分布式锁是...
现在很多项目单机版已经不满足了,分布式变得越受欢迎,同时也带来很多问题,分布式锁也变得没那么容易实现,分享一个redis分布式锁工具类,里面的加锁采用lua脚本(脚本比较简单,采用java代码实现,无须外部调用...
总的来说,Redis分布式锁和Java信号量都是解决并发问题的有效手段,理解并掌握它们对于开发高并发、高可用的分布式系统至关重要。通过深入学习和实践,我们可以更好地应对复杂分布式环境下的挑战。
本篇将深入探讨如何将RedisTemplate封装成RedisUtils工具类,并实现分布式锁功能。 首先,我们需要引入Spring Data Redis的依赖库,这通常在项目的pom.xml或build.gradle文件中完成。添加对应版本的Redis连接器和...
redis分布式锁的工具类,采用的是Lua代码的方式,保证了Java执行方法的原子性。
Java集成步骤包括:引入Redis客户端依赖、编写分布式锁工具类利用Redis命令实现加锁/解锁等操作。 3. 集成Spring Boot: Spring Boot可以大大简化Java应用的开发过程。集成Spring Boot主要包括:创建Spring Boot项目...
Redis分布式锁通常通过以下几个步骤实现: 1. **加锁**:客户端向Redis服务器发送请求,尝试为某个键(通常称为锁)设置一个带有过期时间的值。如果键不存在,则设置成功并返回“锁已获取”;如果键已存在,则表明...
首先,Redis分布式锁的实现主要依赖于两个命令:`SETNX`(Set if Not eXists)和`EXPIRE`。`SETNX`命令用于原子性地设置一个键值,如果键不存在,则设置成功,否则返回失败。`EXPIRE`命令则用于为键设置过期时间,以...
在SpringBoot应用中集成Redis分布式锁,可以创建一个`RedisLock`工具类,包含加锁和解锁的方法。加锁操作需要确保原子性,即同时设置键和过期时间,这在SpringBoot 2.x版本以上可以通过`opsForValue().setIfAbsent()...
**Redis分布式锁的原理** 分布式锁通常需要满足以下条件: 1. **互斥性**:在同一时刻,只能有一个客户端获取锁。 2. **可重入性**:持有锁的客户端可以再次获取该锁,防止死锁。 3. **自动续期**:防止锁过期导致...
Redisson是一款功能丰富的Java客户端,它提供了对Redis服务器的全面支持,包括数据结构服务、分布式服务、锁服务等。在分布式系统中,锁是保证数据一致性的重要工具,而Redisson的分布式锁则为Java开发者提供了一种...
综上所述,基于Redis的Java分布式锁实现涉及到多个层面的设计,包括锁的获取、释放、异常处理、锁的生命周期管理以及并发控制等。通过这种方式,可以有效地在分布式系统中实现对共享资源的安全访问。
Redis因其高性能、轻量级的特性,成为了实现分布式锁的常用工具。 首先,我们需要理解分布式锁的基本概念。分布式锁是一种在分布式系统中用于协调不同节点间操作的机制,它确保在同一时刻,只有一个客户端能够执行...
以下是一个简化的Redis工具类代码片段,展示了如何使用`List`实现等待序列的分布式锁: ```java public class RedisUcUitl { // ... 省略常量和构造方法 ... // 存储redis队列,将值存入队列头部 public static...
Redis作为一种内存数据库,因其高性能、易用性和丰富的数据结构,常被用作实现分布式锁的工具。以下是如何在Redis中实现分布式锁的步骤: 1. **设置锁**:客户端向Redis服务器发送`SET key value EX timeout NX`...
分布式锁在高并发环境下是必不可少的工具,它主要用于协调分布在不同节点上的进程,确保在多线程或多机器间对共享资源的访问具有互斥性。SpringBoot作为一个轻量级的Java开发框架,常用于快速构建微服务应用。结合...
Redisson在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的一系列优势,在Java实用工具包中常用接口的基础上,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的...
压缩包中的“工具类和使用方法”文件应该包含了具体实现分布式锁的工具类以及如何在代码中使用自定义注解的示例。通过阅读和理解这些代码,开发者可以快速掌握如何在项目中集成这个分布式锁。 总的来说,本方案提供...