@Slf4j
public class RedisLock {
private String key;
private long timeout = 2;
private TimeUnit unit = TimeUnit.MINUTES;
private int tryNum = 0;
private int tryNumLimit = 0;
private String uuid;
private RedisTemplate<String,Object> redisTemplate;
public void setTryNumLimit(int tryNumLimit) {
this.tryNumLimit = tryNumLimit;
}
public RedisLock(String key) {
this.key = key;
redisTemplate = SpringContextUtil.getBean("redisTemplate");
uuid = UUIDUtil.getUUID32();
}
public RedisLock(String key, long timeout, TimeUnit unit) {
this.key = key;
this.timeout = timeout;
this.unit = unit;
redisTemplate = SpringContextUtil.getBean("redisTemplate");
uuid = UUIDUtil.getUUID32();
}
public RedisLock(String key, long timeout, TimeUnit unit, int tryNum) {
this.key = key;
this.timeout = timeout;
this.unit = unit;
this.tryNum = tryNum;
redisTemplate = SpringContextUtil.getBean("redisTemplate");
uuid = UUIDUtil.getUUID32();
}
public boolean tryLock(){
if (tryNumLimit != 0 && ++tryNum > tryNumLimit){
throw new CheckedException("系统繁忙,请稍后再试");
}
return redisTemplate.opsForValue().setIfAbsent(key,this.uuid,timeout, unit);
}
public void unLock(){
Object o = redisTemplate.opsForValue().get(key);
if (o != null && this.uuid.equals((String)o)){
redisTemplate.delete(key);
}else {
log.info("不是当前对象持有锁,无法释放");
}
}
}
基于RedisTemplate实现简单redis分布式锁
最新推荐文章于 2025-06-21 21:51:39 发布