java使用redis分布式锁代码
时间: 2025-03-06 22:45:31 浏览: 11
使用 Redis 实现 Java 分布式锁
获取与释放分布式锁的方法
为了确保线程安全,在多实例环境下协调资源访问,可以通过 tryGetDistributedLock
方法来尝试获得一个分布式的互斥锁。此方法接收四个参数:Redis 连接对象 (jedis
)、代表锁定目标的唯一标识符 (lockKey
)、请求者的身份识别码 (requestId
) 和设定的最大持有期限 (单位为秒) (expireTime
)。
当调用该函数时,会检查给定键是否存在。如果不存在,则创建它并关联上特定的时间戳作为过期机制的一部分,以此防止死锁的发生[^3]。
public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
String result = jedis.set(lockKey, requestId, "NX", "EX", expireTime);
return "OK".equals(result);
}
上述代码片段展示了如何利用 Jedis 库中的 set
命令配合 "NX"
(仅在键不存在时设置)和 "EX"
(以秒为单位指定生存时间)选项来实现加锁操作。
对于解锁过程而言,考虑到并发场景下可能出现的竞争条件问题,采用 Lua 脚本来原子化地完成这一动作是非常必要的。下面给出了解除已获锁的具体做法:
if redis.call("GET", KEYS[1]) == ARGV[1] then
return redis.call("DEL", KEYS[1])
else
return 0
end
这段 Lua 脚本被封装成如下所示的一个辅助工具类内的静态成员函数 releaseLock
中,用来验证当前进程确实是之前成功取得这把锁的那个,并且只允许真正的拥有者去移除对应的记录条目[^4]。
public static void releaseLock(Jedis jedis, String lockKey, String requestId) {
String luaScript =
"if redis.call('get', KEYS[1]) == ARGV[1] then "
+ "return redis.call('del', KEYS[1]) "
+ "else "
+ "return 0; "
+ "end";
jedis.eval(luaScript, Collections.singletonList(lockKey), Collections.singletonList(requestId));
}
以上就是基于 Redis 的简单版 Java 分布式锁的核心部分——获取与释放锁的过程描述及其相应的源代码展示。
阅读全文
相关推荐


















