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); // 返回空实现
}
相关推荐
薪火铺子12 小时前
CAS单点登录原理与实践
java·后端
知兀12 小时前
【微服务/nacos】Nacos注册中心原理;配置服务发现中间、配置中心
java·微服务·架构
一 乐12 小时前
茶叶商城|基于springboot + vue茶叶商城系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·茶叶商城系统
AI进化营-智能译站12 小时前
ROS2 C++开发系列06:变量、数据类型与IO实战
java·开发语言·c++·ai
薪火铺子14 小时前
OAuth2 + JWT 微服务认证方案深度解析
java·运维·微服务
diangedan15 小时前
Android冻屏
android·java
abcnull21 小时前
用javaparser做精准测试
java·ast·静态代码分析·精准测试·javaparser
叶小鸡21 小时前
Java 篇-项目实战-苍穹外卖-笔记汇总
java·开发语言·笔记
AI人工智能+电脑小能手21 小时前
【大白话说Java面试题】【Java基础篇】第22题:HashMap 和 HashSet 有哪些区别
java·开发语言·哈希算法·散列表·hash
juniperhan21 小时前
Flink 系列第21篇:Flink SQL 函数与 UDF 全解读:类型推导、开发要点与 Module 扩展
java·大数据·数据仓库·分布式·sql·flink