redis分布式锁工具类
时间: 2023-07-17 20:09:37 浏览: 102
redission分布式锁工具类
我可以为您提供一个基于 Redis 的简单分布式锁的示例代码,您可以根据自己的需求进行修改和扩展。以下是一个 Java 版本的实现:
```java
import redis.clients.jedis.Jedis;
public class RedisDistributedLock {
private static final String LOCK_PREFIX = "lock:";
private static final int LOCK_EXPIRE = 300; // 锁的过期时间,单位为秒
private static final int ACQUIRE_TIMEOUT = 10; // 获取锁的超时时间,单位为秒
private Jedis jedis;
public RedisDistributedLock(Jedis jedis) {
this.jedis = jedis;
}
public boolean acquireLock(String lockKey, String requestId) {
String lockName = LOCK_PREFIX + lockKey;
long endTimeMillis = System.currentTimeMillis() + (ACQUIRE_TIMEOUT * 1000);
while (System.currentTimeMillis() < endTimeMillis) {
String result = jedis.set(lockName, requestId, "NX", "EX", LOCK_EXPIRE);
if ("OK".equals(result)) {
return true;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
return false;
}
public void releaseLock(String lockKey, String requestId) {
String lockName = LOCK_PREFIX + lockKey;
String storedRequestId = jedis.get(lockName);
if (requestId.equals(storedRequestId)) {
jedis.del(lockName);
}
}
}
```
这是一个简单的分布式锁工具类,它使用了 Redis 的 `SET` 命令来尝试获取锁,并设置了过期时间。当获取锁失败时,会等待一段时间后重试,直到超过获取锁的超时时间。当释放锁时,会先检查锁是否属于当前请求,然后再删除锁。
您可以使用该类来实现分布式锁,例如:
```java
Jedis jedis = new Jedis("localhost");
RedisDistributedLock lock = new RedisDistributedLock(jedis);
String lockKey = "myLock";
String requestId = UUID.randomUUID().toString();
if (lock.acquireLock(lockKey, requestId)) {
try {
// 执行需要加锁的代码块
} finally {
lock.releaseLock(lockKey, requestId);
}
} else {
// 获取锁失败的处理逻辑
}
```
请注意,这只是一个简单的示例,用于演示如何使用 Redis 实现分布式锁。在实际使用中,您可能需要考虑更多的因素,如锁的可重入性、死锁检测、宕机恢复等。
阅读全文