如何在Redis中设置不同业务Key的优先级淘汰_通过设置不同的TTL值

落丽大大_1611

落丽大大_1611

2026-06-01

251人浏览

原创

volatile-ttl策略通过随机采样带过期时间的key,从中淘汰ttl最小者,实现低优先级key更早被淘汰;它不扫描全量、仅依赖ttl差异,且未设过期时间的key不参与淘汰。

如何在redis中设置不同业务key的优先级淘汰_通过设置不同的ttl值

Redis 本身不支持按业务维度设置「Key 优先级」,也没有内置的权重机制。但你可以利用 volatile-ttl 淘汰策略 + 合理控制不同 Key 的 TTL 值,间接实现「高优先级 Key 存活得更久、低优先级 Key 更早被淘汰」的效果。

volatile-ttl 策略如何依赖 TTL 值做淘汰决策

当 Redis 内存达到 maxmemory 且启用 volatile-ttl 时,它会在所有设置了过期时间的 Key 中,**随机采样一批(默认 5 个),从中选出 TTL 最小的那个淘汰**。注意:不是全局扫描所有过期 Key,而是采样后局部比较 —— 所以 TTL 差异要足够明显,才能提高「低优先级 Key 先被选中」的概率。

关键点:

  • TTL 值越小,该 Key 在采样中被选为淘汰目标的概率越高
  • 没设置过期时间的 Key 不会进入候选池,volatile-ttl 对它们完全无效
  • 如果当前所有带过期时间的 Key 的 TTL 都大于 300 秒,而你期望某类缓存 60 秒就让出内存,那必须显式设 EXPIRE key 60

如何为不同业务 Key 分配有区分度的 TTL

不能只靠「业务重要性」拍脑袋定 TTL,得结合访问模式和容忍延迟反推:

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • 高频读写、强一致性要求的业务(如用户登录态):设较长 TTL(如 3600),并搭配 volatile-lru 或 allkeys-lru 防止突发写入挤掉它
  • 临时计算结果、降级兜底数据(如推荐 fallback 缓存):设极短 TTL(如 60 或 30),确保内存紧张时优先被清掉
  • 静态配置类(如开关、白名单):可设超长 TTL(86400),甚至不设过期 —— 但要注意:不设过期的 Key 在 volatile-* 策略下完全免疫淘汰
  • 避免 TTL 过于接近:比如 A 类设 300、B 类设 301,实际淘汰倾向几乎无差别;建议至少拉开 3~5 倍差距(如 120 vs 600)

为什么不能只靠 volatile-ttl 实现精准优先级

Redis 的 TTL 淘汰是概率性、采样式的,不是精确排序。这意味着:

  • 即使某个 Key 的 TTL 是全场最小,它也不保证「下一次淘汰一定轮到它」
  • 若业务 Key 总数极少(比如只有 3 个带过期的 Key),采样可能反复命中同一组,导致淘汰不均衡
  • PTTL 命令返回值:key 不存在时是 -2,未设过期是 -1,这些边界值在监控脚本里容易误判为「即将淘汰」
  • 如果误将核心 Key 设了短 TTL,又启用了 volatile-ttl,它反而比其他 Key 更危险 —— 这种错误在线上很常见

真正可控的替代方案:用命名空间 + allkeys-lru 配合业务逻辑

如果你发现靠 TTL 差值调控太不可靠,更稳的做法是放弃 volatile-* 系列,改用 allkeys-lru,然后在业务层控制访问频次:

  • 给高优先级 Key(如用户 session)定期执行 GET 或 TOUCH,保持其 LRU 时间戳最新
  • 低优先级 Key(如日志聚合中间结果)写入后从不主动读,自然成为 LRU 尾部候选
  • 用统一前缀隔离业务域(如 sess:u1001、tmp:report_20260528),便于后续通过 SCAN + TTL 批量分析淘汰倾向
  • 注意:TOUCH 在 Redis 6.0+ 才支持,老版本只能靠 GET + 忽略返回值

真正决定淘汰顺序的,从来不是你写的那个数字,而是 Redis 实际采样时看到的 TTL 分布和你的 Key 访问节奏。把 TTL 当作信号而非开关,才能避开「设了 60 秒却总不被淘汰」或「设了 3600 秒结果第一天就被扫光」这类典型陷阱。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

redis

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4449

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

3995

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

7352

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

643

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

756

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

7162

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1160

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1076

6

redis主要作用有哪些
redis主要作用有哪些

redis 的主要作用包括:1. 缓存数据,提高访问速度;2. 充当消息队列,实现消息传递;3. 存储各种数据类型,如字符串、散列和集合;4. 管理会话信息,确保可靠性和可用性;5. 限制请求速率,防止服务器超载等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

6298

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习