使用时需要注入redisTemplate 可以百度搜一下怎么使用spring-date-redis
//设置锁
public boolean lock(String lock) {
return (boolean) redisTemplate.execute((RedisCallback) connection -> {
//获取时间毫秒值
long expireAt = System.currentTimeMillis() + LOCK_EXPIRE + 1;
// 获取锁成功
if (!connection.exists((LOCK_PREFIX + lock).getBytes())) {
//此处时间设置的是秒
connection.setEx((LOCK_PREFIX + lock).getBytes(),100, String.valueOf(expireAt).getBytes());
return true;
} else { // 获取锁失败
return false;
}
});
}
//释放锁
public void deleteLock(String key) {
redisTemplate.delete(LOCK_PREFIX + key);
}
//正常调用锁。获取不到循环等待。获取到跳出循环。
public void getUniqueDateTime(String lock_key){
try{
if(lock(lock_key)){
//正常获取到锁执行逻辑
logger.info("正常进入锁执行流程。");
deleteLock(lock_key);
}else{
//没有获取到锁循环等待5次,终止条件
int lockCount=5;
while (lockCount>0){
lockCount--;
if(lock(lock_key)){
lockCount=-1; //获取锁成功终止循环并执行代码逻辑
logger.info("重新获取锁成功。");
deleteLock(lock_key);
}else{
if(lockCount>0){
Thread.sleep(5000L);
logger.info("五秒钟重新获取锁。");
}else{
//循环停止
logger.info("循环终止,没有获取到锁当前访问人数过多。");
}
}
}
}
}catch (Exception e){
//捕获到异常删除锁
deleteLock(lock_key);
e.printStackTrace();
}
}
【无标题】redisTemplate实现Redis 锁
最新推荐文章于 2025-03-30 02:50:32 发布