代码
支持自动续期
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* 滑动过期时间
*/
@Slf4j
@Component
public class RedisSlidingExpirationUtil {
@Resource
private RedisTemplate<String, String> redisTemplate;
/**
* 获取值并自动续期(滑动过期)
*
* @param key Redis键
* @param timeout 过期时长
* @param unit 时间单位
* @return 对应的值,如果key不存在返回null
*/
public String getAndRefresh(String key, long timeout, TimeUnit unit) {
// 1. 先获取值
String value = redisTemplate.opsForValue().get(key);
// 2. 如果值存在,则刷新过期时间
if (Objects.nonNull(value)) {
Boolean success = redisTemplate.expire(key, timeout, unit);
if (!success) {
// 可选:记录日志,说明续期失败(可能key刚被删除)
log.error("Redis续期失败: {}", key);
}
}
return value;
}
/**
* 设置值并初始化过期时间
*/
public void setWithSlidingExpire(String key, String value, long timeout, TimeUnit unit) {
redisTemplate.opsForValue().set(key, value, timeout, unit);
}
}