java redis分布式锁代码实现
时间: 2025-06-05 17:34:18 浏览: 15
### Java中使用Redis实现分布式锁的代码示例
以下是基于Jedis库实现的Redis分布式锁的完整代码示例,包括加锁和解锁的操作逻辑。此代码参考了相关引用内容,并结合了专业实践[^1]。
```java
import redis.clients.jedis.Jedis;
public class RedisDistributedLock {
private static final String LOCK_SUCCESS = "OK";
private static final String SET_IF_NOT_EXIST = "NX";
private static final String SET_WITH_EXPIRE_TIME = "PX";
/**
* 尝试获取分布式锁
*
* @param jedis Redis客户端实例
* @param lockKey 锁的键名
* @param requestId 请求唯一标识符
* @param expireTime 锁的有效时间(毫秒)
* @return 是否成功获取锁
*/
public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
return LOCK_SUCCESS.equals(result);
}
/**
* 释放分布式锁
*
* @param jedis Redis客户端实例
* @param lockKey 锁的键名
* @param requestId 请求唯一标识符
* @return 是否成功释放锁
*/
public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedis.eval(script, java.util.Collections.singletonList(lockKey), java.util.Collections.singletonList(requestId));
if (RELEASE_SUCCESS.equals(result)) {
return true;
}
return false;
}
}
```
#### 代码说明
1. **加锁逻辑**:
- 使用 `jedis.set` 方法设置锁,参数 `NX` 表示只有键不存在时才进行设置[^2]。
- 参数 `PX` 表示设置锁的过期时间,单位为毫秒。
- 如果返回值为 `"OK"`,则表示成功获取锁。
2. **解锁逻辑**:
- 使用 Lua 脚本确保原子性操作,避免因网络延迟或程序异常导致锁被误删[^3]。
- 脚本检查当前锁的值是否与请求唯一标识符一致,若一致则删除锁。
3. **依赖项**:
- 需要引入 Jedis 库作为 Redis 客户端[^2]。
- Maven 依赖配置如下:
```xml
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.0.0</version>
</dependency>
```
#### 注意事项
- **唯一标识符**:`requestId` 必须是全局唯一的字符串,通常可以使用 UUID 生成。
- **锁超时时间**:需根据业务场景合理设置锁的过期时间,防止死锁。
- **线程安全**:在多线程环境下,应确保 Redis 客户端实例的正确使用。
阅读全文
相关推荐














