Redis的过期策略以及内存淘汰机制

一、过期策略(针对设置了过期时间的键)

Redis 会为设置了 expire(过期时间)的键维护一个过期字典(记录键与过期时间的映射),并通过以下策略删除过期键:

  1. 惰性删除(Lazy Eviction)

    • 原理 :不主动删除过期键,而是在每次访问键时(如 GET),才检查该键是否过期。若过期则删除并返回 nil,否则正常返回值。
    • 优点:节省 CPU 资源,无需额外的删除操作,只在必要时检查。
    • 缺点:可能导致大量过期键堆积在内存中,浪费内存空间(例如一个键过期后长期未被访问,会一直占用内存)。
  2. 定期删除(Periodic Eviction)

    • 原理 :Redis 会每隔一段时间(由 hz 配置控制,默认 10 次 / 秒)主动触发一次过期键删除任务,具体流程:
      1. 从过期字典中随机抽取部分键(默认每次检查 20 个)。
      2. 删除其中已过期的键。
      3. 若过期键比例超过 25%,则重复步骤 1(避免大量过期键未被处理),但为了防止阻塞主线程,会限制最大执行时间(默认不超过 25ms)。
    • 优点:平衡了 CPU 和内存资源,主动清理部分过期键,减少内存浪费。
    • 缺点:仍可能存在少量过期键未被及时删除(受限于随机抽样和执行时间)。
  3. 内存淘汰机制的补充

    当以上两种策略未及时删除过期键,导致内存占用达到 maxmemory 限制时,会触发 内存淘汰机制(见下文),进一步清理内存(包括过期键和未过期键)。

二、内存淘汰机制(针对内存达到上限时)

当 Redis 内存使用量达到配置的 maxmemory 阈值时,会触发内存淘汰机制,选择部分键删除以释放内存。具体策略由 maxmemory-policy 配置,分为以下 8 种:

  1. 仅淘汰过期键的策略

    • volatile-lru:从设置了过期时间的键中,淘汰最近最少使用(LRU,Least Recently Used)的键。
    • volatile-lfu:从设置了过期时间的键中,淘汰最不经常使用(LFU,Least Frequently Used)的键。
    • volatile-ttl:从设置了过期时间的键中,淘汰剩余过期时间最短(TTL 最小)的键。
    • volatile-random:从设置了过期时间的键中,随机淘汰一个键。
  2. 淘汰所有键的策略(包括未设置过期时间的)

    • allkeys-lru:从所有键中,淘汰最近最少使用的键。
    • allkeys-lfu:从所有键中,淘汰最不经常使用的键。
    • allkeys-random:从所有键中,随机淘汰一个键。
  3. 不淘汰键的策略

    • noeviction(默认策略):不淘汰任何键,当内存不足时,拒绝所有写操作(返回错误 OOM command not allowed when used memory > 'maxmemory'),读操作正常。

三、总结

  • 过期策略:通过 "惰性删除 + 定期删除" 主动清理过期键,优先保证 CPU 效率,同时减少内存浪费。
  • 内存淘汰机制:当内存达到上限时,根据配置的策略淘汰部分键(可能是过期键或未过期键),避免 Redis 因内存不足崩溃。

实际使用中,需根据业务场景选择合适的内存淘汰策略(例如缓存场景常用 allkeys-lruvolatile-lru)。

相关推荐
HackTwoHub4 小时前
AI大模型网关存在SQL注入、附 POC 复现、影响版本LiteLLM 1.81.16~1.83.7(CVE-2026-42208)
数据库·人工智能·sql·网络安全·系统安全·网络攻击模型·安全架构
wuminyu4 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
l1t4 小时前
DeepSeek总结的DuckLake构建基于 SQL 原生表格式的下一代数据湖仓
数据库·sql
KmSH8umpK4 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第八篇
数据库·redis·分布式
TDengine (老段)5 小时前
从施工监测到运营预警,桥科院用 TDengine 提升桥梁数据管理能力
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
callJJ6 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
S1998_1997111609•X6 小时前
论mysql国盾shell-sfa犯罪行为集团下的分项工程及反向注入原理尐深度纳米算法下的鐌檵鄐鉎行为
网络·数据库·网络协议·百度·开闭原则
wbs_scy6 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
KmSH8umpK7 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第七篇
数据库·redis·分布式
0xDevNull7 小时前
Linux 中 Nginx 代理 Redis 的详细教程
redis·后端