通过redistemplate实现分布式锁,并且写出get和set以及delete方法的demo
时间: 2024-10-26 15:17:50 浏览: 32
RediTemplate是Spring Data Redis库中的一个工具类,它提供了一种方便的方式来操作Redis数据,包括实现分布式锁。分布式锁是保证在分布式系统中对共享资源的一致访问控制,通常使用的是基于Key-Value的数据结构。
以下是一个简单的Distributed Lock使用RediTemplate的`Setnx`, `Expire`和`Del`方法的示例。假设我们有一个名为`distributed_lock_key`的前缀:
```java
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
public class DistributedLockService {
private final RedisTemplate<String, String> redisTemplate;
public DistributedLockService(RedisTemplate<String, String> redisTemplate) {
this.redisTemplate = redisTemplate;
}
// 使用Setnx获取分布式锁
public boolean lock(String lockName, long timeoutInSeconds) {
String key = "distributed_lock_key:" + lockName;
ValueOperations<String, String> operations = redisTemplate.opsForValue();
return operations.setnx(key, System.currentTimeMillis() + timeoutInSeconds * 1000).booleanValue();
}
// 释放已获取的锁
public void unlock(String lockName) {
String key = "distributed_lock_key:" + lockName;
redisTemplate.delete(key);
}
// 删除超时未解锁的锁
public void cleanExpiredLocks(long timeoutInSeconds) {
String pattern = "distributed_lock_key:*";
Long count = redisTemplate.execute((RedisConnection connection) -> {
return connection.scanCount(pattern, "*");
});
if (count > 0) {
List<String> keys = redisTemplate.execute((RedisConnection connection) -> {
return connection.scan(pattern, null, 0, count);
});
for (String key : keys) {
if (!key.endsWith(System.currentTimeMillis())) { // 如果锁过期
redisTemplate.delete(key);
}
}
}
}
}
```
在这个例子中,`lock`方法试图设置一个过期时间的键值对,如果该键已经存在,则说明锁已经被其他线程持有;`unlock`方法则直接删除指定的锁;`cleanExpiredLocks`用于定期检查并删除那些过期的锁。
阅读全文