Spring 教程

Spring 笔记

spring-data-redis 如何使用 RedisTemplate 进行 set EX NX(不存在时赋值 value 并设置过期时间)的原子操作

Spring 笔记 Spring 笔记


在使用 spring-data-redis 库提供的 redis client 对象 RedisTemplate 进行 set EX NX(不存在时赋值 value 并设置过期时间)的原子操作时,低版本的库发现只有 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;
}