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); // 返回空实现
}
相关推荐
tekin26 分钟前
Go、Java、Python、C/C++、PHP、Rust 语言全方位对比分析
java·c++·golang·编程语言对比·python 语言·php 语言·编程适用场景
qq_5298353527 分钟前
Redis作为缓存和数据库的数据一致性问题
数据库·redis·缓存
李长渊哦1 小时前
Java 虚拟机(JVM)方法区详解
java·开发语言·jvm
陌殇殇3 小时前
002 SpringCloudAlibaba整合 - Feign远程调用、Loadbalancer负载均衡
java·spring cloud·微服务
猎人everest3 小时前
SpringBoot应用开发入门
java·spring boot·后端
知初~4 小时前
出行项目案例
hive·hadoop·redis·sql·mysql·spark·database
山猪打不过家猪5 小时前
ASP.NET Core Clean Architecture
java·数据库·asp.net
AllowM5 小时前
【LeetCode Hot100】除自身以外数组的乘积|左右乘积列表,Java实现!图解+代码,小白也能秒懂!
java·算法·leetcode
不会Hello World的小苗6 小时前
Java——列表(List)
java·python·list
艾斯比的日常6 小时前
提升接口性能之缓存
缓存