基于java springBoot生成redis锁代码
时间: 2023-11-27 17:02:57 浏览: 59
下面是一个基于Java Spring Boot生成Redis锁代码的示例:
```java
@Service
public class RedisLockService {
@Autowired
private RedisTemplate<String, String> redisTemplate;
/**
* 获取锁
* @param key 锁的名称
* @param expireTime 锁的过期时间
* @return 是否获取锁成功
*/
public boolean lock(String key, long expireTime) {
// 获取当前时间
long now = System.currentTimeMillis();
// 计算锁的过期时间
long expire = now + expireTime;
// 将锁的过期时间存入Redis
Boolean result = redisTemplate.opsForValue().setIfAbsent(key, String.valueOf(expire));
// 如果设置锁成功,则获取锁成功;否则获取锁失败
if (result != null && result) {
return true;
}
// 获取锁失败,则检查锁是否过期
String oldExpireTime = redisTemplate.opsForValue().get(key);
// 如果锁已过期,则重新设置锁
if (oldExpireTime != null && Long.parseLong(oldExpireTime) < now) {
// 获取旧的锁过期时间
String currentExpireTime = redisTemplate.opsForValue().getAndSet(key, String.valueOf(expire));
// 如果旧的锁过期时间等于当前的过期时间,则获取锁成功;否则获取锁失败
return currentExpireTime != null && currentExpireTime.equals(oldExpireTime);
}
// 获取锁失败
return false;
}
/**
* 释放锁
* @param key 锁的名称
*/
public void unlock(String key) {
redisTemplate.delete(key);
}
}
```
这个示例中,我们使用Redis的setnx命令来设置锁。如果设置成功,则获取锁成功;否则获取锁失败。如果获取锁失败,则检查锁是否过期。如果锁已过期,则重新设置锁。如果旧的锁过期时间等于当前的过期时间,则获取锁成功;否则获取锁失败。在释放锁时,我们使用Redis的del命令来删除锁。