可以起到@Synchronized的效果,但是比同步效果要好。比如在秒杀场景中等,使用中要先加锁,处理完业务代码后记得要解锁!
@Component
@Slf4j
public class RedisLock {
@Autowired
private StringRedisTemplate redisTemplate;
/**
* 功能描述: 加锁
* @param: key value 当前时间+超时时间
* @return: boolean
* @auther: Rhine
* @date: 2018/11/8 2:40
*/
public boolean lock(String key,String value){
if (redisTemplate.opsForValue().setIfAbsent(key, value)){
return true;
}
String currentValue=redisTemplate.opsForValue().get(key);
//如果锁过期
if (!StringUtils.isEmpty(currentValue)&&Long.parseLong(currentValue)<System.currentTimeMillis()){
//获取上一个锁的时间
String oldValue=redisTemplate.opsForValue().getAndSet(key, value);
if (!StringUtils.isEmpty(oldValue)&&oldValue.equals(currentValue)){
return true;
}
}
return false;
}
/**
* 功能描述: 解锁
* @param: [key, value]
* @return: void
* @auther: Rhine
* @date: 2018/11/8 3:03
*/
public void unlock(String key,String value){
try{
String currentValue=redisTemplate.opsForValue().get(key);
if (!StringUtils.isEmpty(currentValue)&¤tValue.equals(value)){
redisTemplate.opsForValue().getOperations().delete(key);
}
}catch (Exception e){
log.error("【redis分布式锁】 解锁异常,{}",e);
}
}
}