在使用 spring-data-redis 库提供的 redis client 对象 RedisTemplate 进行 set EX NX 的原子操作时,低版本的库发现只有 Boolean setIfAbsent(K key, V value)
方法,没有同时设置过期时间的方法。
如使用 spring boot 低版本时,无法实现,需要对应的 spring-data-redis 包升级到 2.1.x 版本以上,提供了 Boolean setIfAbsent(K key, V value, long timeout, TimeUnit unit)
。
解决方法
如果使用 spring boot 框架,建议升级到对应 spring-data-redis 2.1.x 以上的版本,如果项目还使用 spring cloud,可查看 spring-cloud-dependencies 关于 spring boot 和 spring cloud 版本对应详细说明及作用。
如果只是使用 spring framework(框架),只需要单独将 spring-data-redis 升级到 2.1.x 以上版本即可:
maven 中央仓库坐标列表 https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis。
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public boolean setNXEX(String key) {
try {
Boolean result = redisTemplate.opsForValue().setIfAbsent(key, 1, 60, TimeUnit.SECONDS);
if (result != null) {
return result.booleanValue();
}
} catch (Throwable e) {
log.error("setNXEX error", e);
}
return false;
}