网络看到很多各种方式的redis的使用,但是都无法避免原子操作的保证,看到很多各种麻烦的方式,很难实现,而且存在各种问题。redis自己提供了安全的原子操作方式。
redis命令:
SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX seconds : 将键的过期时间设置为 seconds 秒。 执行 SET key value EX seconds 的效果等同于执行 SETEX key seconds value 。
PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒。 执行 SET key value PX milliseconds 的效果等同于执行 PSETEX key milliseconds value 。
NX : 只在键不存在时, 才对键进行设置操作。 执行 SET key value NX 的效果等同于执行 SETNX key value 。
XX : 只在键已经存在时, 才对键进行设置操作
java中的使用:
引用spring-boot依赖,使用RedisTemplate.java类
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 尝试操作,线程安全的操作
* outTime 设定超时时间,timeUnit 超时时间的单位 建议秒和毫秒
* @return true 操作成功, false 操作失败
*/
public Boolean tryLock(String lockKey, Object value, long outTime, TimeUnit timeUnit){
try {
ValueOperations realValueOperations = redisTemplate.opsForValue();
Boolean status = realValueOperations.setIfAbsent(lockKey, value, outTime, timeUnit);
return status;
}catch (Exception e){
// redis自身异常,并打印异常堆栈
return false;
}
}
/**
* 释放
* @return true 操作成功, false 操作失败
*/
public Boolean releaseLock(String lockKey){
try {
return redisTemplate.delete(lockKey);
}catch (Exception e){
// redis自身异常,并打印异常堆栈
return false;
}
}
ps:面试的时候,很多老的程序员都问怎么保证原子操作的,每次说set方法可以保证,这些人都一脸懵,redis自身已然提供了完善、简单的原子操作命令,相应的方法自然在java的内库中也存在,何必一直问这个问题呢,说了你还没听过,还说我不会...时代已经不再是处于setNX和Lua语言的时代了,大人,时代变了。下次再面试,遇到了直接代码糊脸上