目录
- 前言
- 1. 基本知识
- 2. Java代码
前言
🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF
单纯学习Redis可以看我前言的Java基本知识路线!!
对于Java的基本知识推荐阅读:
- java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
- 【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,使其在创建后立即过期
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思路:
-
设置极短 TTL:
推荐方式,通过设置 Duration.ofMillis(1) 实现禁用
优点是直接在 Redis 中生效,且无需额外逻辑 -
手动删除键:缺点是需要额外的删除操作,增加复杂度
使用 RedisTemplate 明确删除:
RedisTemplate<String, Object> redisTemplate = // 获取 RedisTemplate 实例
redisTemplate.delete("drag:cache:page");
- 返回空缓存实现:
如果不希望在 Redis 中存储该键,可以直接返回一个空的 RedisCache 实现:
if ("drag:cache:page".equals(name)) {
return new RedisCache(name, null, cacheConfig); // 返回空实现
}