logo 范 · 拾光录
网址收集 关于作者 Github Gitee
杂文随笔4
Hexo博客:基础使用Hexo博客:Next主题Hexo博客:Next进阶使用Hexo博客:Next高级配置
前端编程3
前端基础知识16
Vue框架19
UniApp15
Java编程8
Java基础知识14
SpringBoot35
SpringMVC15
MyBatis9
Spring Cloud Netflix8
Spring Cloud Alibaba7
RocketMQ1
MyCat1
数据库4
MySQL12
Redis8
MongoDB10
H21
Java技术栈1
分布式锁的实现方案
软件工具箱14
IDEAGitMavenGradleNginx安装Nginx配置JMeter压测OllamaPicGoRustFSVSCodeDockerObsidianObs录制
Linux知识11
Linux常用命令Jar启动脚本VirtualBox安装CentOSVirtualBox安装Ubuntu树莓派安装及使用frp内网穿透ArchLinux:常用软件ArchLinux:基础系统安装ArchLinux:深度优化ArchLInux:图形化界面安装ArchLinux:Niri
Python编程6
Python基础知识Python语法yolo目标检测OpenCV的使用及树莓派平台condauv
AI相关9
Claude CodeHermes AgentOpenAI基本使用OpenAI工具调用OpenAI记忆管理OpenAI推理执行OpenAI开发框架Langchainllama.cpp
创意设计2
Blender:入门知识UI设计基础知识

代码

支持自动续期

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);
    }

}
代码