/**
* redis分布式锁
* @author GAOMINGQIAN
*
*/
@Component
public class RedisLock {
@Autowired
private RedisTemplate redisTemlate;
/**
* 加锁操作
* @param key
* @param value 当前时间+超时时间
* @return
*/
public boolean lock(String key,String value){
if(redisTemlate.opsForValue().setIfAbsent(key, value)){
return true;
}
String currentValue=(String) redisTemlate.opsForValue().get(key);
//如果锁过期
if(!StringUtils.isEmpty(currentValue)&&Long.parseLong(currentValue)<System.currentTimeMillis()){
//获取上一个锁的时间 下面这行代码只有一个线程在执行
String oldValue=(String) redisTemlate.opsForValue().getAndSet(key, value);
if(!StringUtils.isEmpty(oldValue)&&oldValue.equals(currentValue)){
return true;
}
}
return false;
}
/**
* 解锁操作
* @param key
* @param value
*/
public void unlock(String key,String value){
try{
String currentValue=(String) redisTemlate.opsForValue().get(key);
if(!StringUtils.isEmpty(currentValue)&¤tValue.equals(value)){
redisTemlate.opsForValue().getOperations().delete(key);
}
}catch(Exception e){
Log.error("解锁失败");
}
}
}
转载于:https://my.oschina.net/gaomq/blog/1788665