对于String类型很容易设置原子性的过期时间
public void set(String key, Object value, long timeout, TimeUnit unit) {
if(timeout>0){
redisTemplate.opsForValue().set(key, value, timeout, unit);
}else{
redisTemplate.opsForValue().set(key, value);
}
}
但是Hash、Set类型没有设置值和过期时间的原子操作,这种怎么处理呢
public void hset(String key, Object field, Object value, long expire, TimeUnit timeUnit) {
redisTemplate.opsForHash().put(key, field, value);
if (expire > 0) {
redisTemplate.expire(key, expire, timeUnit);
}
}
我们现在是这样做的,有几个缺点和困惑:
- 但是针对已经存在的key进行操作的话,会重置key的过期时间
- 设置过期时间的操作执行失败造成永久的key,有没有必要使用try…catch,捕捉异常删除该key然后返回boolean类型的结果呢?
最后想白嫖一下大家的思路