用JAVA程序实现 redisTemplate 的tryLock redis分布式锁
时间: 2023-10-11 09:08:45 浏览: 178
实现 Redis 分布式锁可以使用 Redis 的 SETNX 命令,在 Redis 中设置一个 key,并且设置过期时间,当 SETNX 返回成功时说明获取锁成功,否则获取锁失败。为了保证锁的安全性,可以将 key 的值设置为一个随机字符串。
下面是使用 redisTemplate 实现分布式锁的示例代码:
```java
public class RedisLock {
private static final Logger LOGGER = LoggerFactory.getLogger(RedisLock.class);
private RedisTemplate<String, Object> redisTemplate;
private String lockKey;
private String lockValue;
private long expireTime;
public RedisLock(RedisTemplate<String, Object> redisTemplate, String lockKey, long expireTime) {
this.redisTemplate = redisTemplate;
this.lockKey = lockKey;
this.expireTime = expireTime;
this.lockValue = UUID.randomUUID().toString();
}
public boolean tryLock() {
Boolean result = redisTemplate.opsForValue().setIfAbsent(lockKey, lockValue, expireTime, TimeUnit.MILLISECONDS);
if (result == null) {
return false;
}
return result;
}
public void unlock() {
try {
Object value = redisTemplate.opsForValue().get(lockKey);
if (value != null && lockValue.equals(value.toString())) {
redisTemplate.delete(lockKey);
}
} catch (Exception e) {
LOGGER.error("unlock error", e);
}
}
}
```
使用示例:
```java
public class RedisLockTest {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Test
public void testRedisLock() {
RedisLock lock = new RedisLock(redisTemplate, "lock_key", 5000);
try {
if (lock.tryLock()) {
// 获取锁成功,执行业务逻辑
// ...
} else {
// 获取锁失败,执行其他逻辑
// ...
}
} finally {
lock.unlock();
}
}
}
```
在以上代码中,tryLock 方法尝试获取锁,如果获取成功返回 true,否则返回 false。unlock 方法用于释放锁。在获取锁时使用了 Redis 的 SETNX 命令,设置 key 的值为随机字符串,并设置过期时间。在释放锁时,先获取 key 的值,如果值与之前设置的值相同,则删除 key。这里需要注意的是,在高并发场景下,释放锁时可能会出现竞态条件,因此可以使用 Lua 脚本来保证原子性。
阅读全文