Redis 中 TTL 的基本知识与禁用缓存键的实现策略(Java)

目录

  • 前言
  • [1. 基本知识](#1. 基本知识)
  • [2. Java代码](#2. Java代码)

前言

🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF

单纯学习Redis可以看我前言的Java基本知识路线!!

对于Java的基本知识推荐阅读:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 【Java项目】实战CRUD的功能整理(持续更新)

在Java项目中,Redis配置了全局的TTL时间,后续想到可以通过设定单个key的TTL时间

1. 基本知识

先补充TTL的基本知识

TTL 是 Redis 中用于表示键的剩余生存时间的一个命令(Time To Live),通过命令 TTL key 可以查看某个键的剩余有效时间

返回值的含义如下:

  • 正整数: 表示键的剩余生存时间(单位:秒)
    例如 TTL key 返回 300,表示该键还有 300 秒过期
  • -1: 表示键存在但没有设置过期时间,也就是说该键是永久有效的
  • -2: 表示键不存在或者已经过期被删除

大致截图如下:

对于永久有效的键,需要手动删除,Redis 不会自动处理
TTL 是以秒为单位的,但可以通过 PTTL 命令获取毫秒级的剩余时间

2. Java代码

禁用单个 Redis 缓存键的实现

针对特定的缓存键(如 drag:cache:page),可以通过以下方式禁用:

策略: 为该键设置极短的 TTL,使其在创建后立即过期

java 复制代码
if ("drag:cache:page".equals(name)) {
    if (cacheConfig != null) {
        cacheConfig = cacheConfig.entryTtl(Duration.ofMillis(1)); // 设置极短的过期时间
    }
    return super.createRedisCache(name, cacheConfig);
}

截图如下:

特别说明的是,此情况会失效:
Duration.ZERO 失败(TTL 为 -1)

在 Spring 的 RedisCacheConfiguration 中,Duration.ZERO 被解释为"永久有效",导致 Redis 未对该键设置 TTL,因此返回 -1

~ Duration.ofMillis(1) 成功

当 TTL 被设置为极短时间(如 1 毫秒),Redis 会将该键立即标记为即将过期。客户端在短时间后访问该键时,Redis 会将其删除,因此相当于"禁用"了该键

总的来说:
Duration.ZERO 通常被认为是不需要过期时间的值,在大多数框架中会导致缓存项被设置为永久有效
使用非常短的 TTL(如 Duration.ofMillis(1))是一种有效实现"禁用"的方法

上述代码是结合实战进行推广:

以下是Demo思路:

  1. 设置极短 TTL

    推荐方式,通过设置 Duration.ofMillis(1) 实现禁用

    优点是直接在 Redis 中生效,且无需额外逻辑

  2. 手动删除键 :缺点是需要额外的删除操作,增加复杂度

    使用 RedisTemplate 明确删除:

java 复制代码
RedisTemplate<String, Object> redisTemplate = // 获取 RedisTemplate 实例
redisTemplate.delete("drag:cache:page");
  1. 返回空缓存实现:
    如果不希望在 Redis 中存储该键,可以直接返回一个空的 RedisCache 实现:
java 复制代码
if ("drag:cache:page".equals(name)) {
    return new RedisCache(name, null, cacheConfig); // 返回空实现
}
相关推荐
Paran-ia7 分钟前
【2025版】Spring Boot面试题
java·spring boot·后端
LUCIAZZZ18 分钟前
JVM之虚拟机运行
java·jvm·spring·操作系统·springboot
酷爱码24 分钟前
Nginx的核心功能--正向代理、反向代理、缓存和Rewrite
运维·nginx·缓存
hello_ejb326 分钟前
聊聊JetCache的缓存构建
java·前端·缓存
cainiao08060543 分钟前
Java 大视界——Java 大数据在智慧交通智能停车诱导系统中的数据融合与实时更新
java·大数据·开发语言
chxii1 小时前
6.2字节流
java·开发语言
不务专业的程序员--阿飞1 小时前
【SQL 如何解锁递归】
java·数据库·sql
嘵奇1 小时前
Spring Boot拦截器详解:原理、实现与应用场景
java·spring boot·后端
八股文领域大手子1 小时前
Java死锁排查:线上救火实战指南
java·开发语言·面试
jackson凌1 小时前
【Java学习笔记】finalize方法
java·笔记·学习