Redis 内存淘汰策略

打印 上一主题 下一主题

主题 960|帖子 960|积分 2880

Redis 内存淘汰策略

Redis 提供了多种 内存淘汰策略(Eviction Policy),用于在内存到达上限时决定如何删除数据,以便存入新的数据。我们详细介绍这些策略的 工作机制、实用场景、优缺点

1. Redis 内存淘汰策略分类

当 Redis 内存到达 maxmemory 限制后,淘汰策略决定如那边理数据。Redis 的淘汰策略重要分为三大类:


  • (1) 拒绝写入(不删除数据)
  • (2) 仅淘汰带逾期时间的 Key
  • (3) 淘汰全部 Key

2. 详细的淘汰策略

(1) noeviction(拒绝写入)



  • 机制:当内存满时,Redis 不会删除任何 Key,而是直接返回错误。
  • 实用场景:实用于 缓存不答应丢失 的情况,比方会话管理金融交易数据等。
  • 长处:

    • 数据绝对安全,不会丢失任何 Key。

  • 缺点:

    • 大概导致 Redis 无法写入数据,影响业务正常运行。
    • 实用于严格管控内存的场景,不实用于缓存(cache)用途。


(2) allkeys-lru(全部 Key 接纳 LRU 淘汰)



  • 机制:在 全部 Key(无论是否有 TTL) 中,淘汰近来最少使用(Least Recently Used, LRU)的 Key。
  • 实用场景:实用于 平常缓存,比方 Web 页面缓存、短期存储等。
  • 长处:

    • 能够自动保留 近来访问的热门数据,提升缓存掷中率。

  • 缺点:

    • 需要额外的 LRU 计算开销(但 Redis 内部已做优化)。


(3) volatile-lru(仅带逾期时间的 Key 接纳 LRU 淘汰)



  • 机制:只淘汰**带 TTL(逾期时间)**的 Key,按照 LRU 规则删除最少使用的 Key。
  • 实用场景:实用于数据有明确逾期时间的缓存(如 Web 页面缓存、令牌管理)。
  • 长处:

    • 不会影响永久存储的数据(无 TTL 的 Key)。

  • 缺点:

    • 假如带 TTL 的 Key 很少,或者都还未逾期,大概导致无法释放足够的内存,最终 Redis 仍然会写入失败。


(4) allkeys-random(全部 Key 随机淘汰)



  • 机制:在全部 Key随机选择一些 Key 举行淘汰,不管是否有 TTL。
  • 实用场景:实用于不要求缓存掷中率的场景,如临时性存储、非核心数据。
  • 长处:

    • 低计算开销,不需要维护访问频率信息。

  • 缺点:

    • 缓存掷中率较低,大概会删除热门数据,导致 Redis 效率降落。


(5) volatile-random(仅带逾期时间的 Key 随机淘汰)



  • 机制:只淘汰 带 TTL 的 Key,随机选择一部门 Key 举行删除。
  • 实用场景:实用于缓存体系,数据有逾期时间,但访问频率无规律。
  • 长处:

    • 制止删除无 TTL 的数据。

  • 缺点:

    • 删除不够智能,大概误删热门数据,影响缓存掷中率。


(6) volatile-ttl(仅带逾期时间的 Key,优先淘汰 TTL 最短的)



  • 机制:在全部带 TTL 的 Key 中,优先删除 TTL 最短的 Key
  • 实用场景:实用于有明确逾期时间的数据(如定期缓存的数据、会话管理)。
  • 长处:

    • 使即将逾期的数据优先被删除,符合一般业务逻辑。

  • 缺点:

    • 假如 TTL 设定不公道(比如大量 Key 逾期时间雷同),仍大概影响掷中率。


3. Redis 6.0+ 的 LFU 淘汰策略

Redis 6.0 引入了 LFU(Least Frequently Used) 淘汰策略,进一步优化 LRU 算法。
(7) allkeys-lfu(全部 Key 接纳 LFU 淘汰)



  • 机制:在 全部 Key 中,淘汰访问最少的 Key
  • 实用场景:实用于热门数据变革较快的场景,如新闻推荐、个性化广告缓存等。
  • 长处:

    • 能够自动保留最常访问的 Key,比 LRU 更智能。

  • 缺点:

    • 计算代价比 LRU 高,但 Redis 内部做了优化(基于近似计数)。

(8) volatile-lfu(仅带 TTL 的 Key 接纳 LFU 淘汰)



  • 机制:在带 TTL 的 Key 中,淘汰访问最少的 Key
  • 实用场景:实用于 对缓存掷中率要求高,且数据带逾期时间 的情况。
  • 长处:

    • 不会误删无 TTL 的 Key,并且优先保留访问频率高的 Key

  • 缺点:

    • 计算开销较高,但 Redis 6.0 举行了优化。


4. 淘汰策略对比总结

淘汰策略实用范围实用场景长处缺点noeviction(默认淘汰策略)全部 Key数据不能丢失的场景(如金融体系)数据安全,不丢失大概导致 Redis 写入失败allkeys-lru全部 Key平常缓存(如 Web 缓存)适应热门数据变革,缓存掷中率高需要维护 LRUvolatile-lru仅带 TTL数据有明确逾期时间的缓存制止删除永久存储的数据若带 TTL 的 Key 很少,大概无法释放足够内存allkeys-random全部 Key临时存储(不要求掷中率)计算简朴缓存掷中率低volatile-random仅带 TTL随机淘汰缓存数据计算简朴大概误删热门数据volatile-ttl仅带 TTL定期缓存数据(如会话管理)优先删除即将逾期的数据TTL 设定不公道大概影响掷中率allkeys-lfu全部 Key热门数据变革快(如推荐体系)优先保留高频访问数据计算比 LRU 略高volatile-lfu仅带 TTL高频访问缓存(如广告缓存)同时考虑访问频率和 TTL计算比 LRU 略高
5. 选择符合的策略



  • 数据不能丢失 ➝ noeviction
  • 平常缓存,保留热门数据 ➝ allkeys-lru
  • 数据有逾期时间,保留热门数据 ➝ volatile-lru
  • 不在意掷中率,只要释放内存 ➝ allkeys-random
  • 热门数据变革快,使用频率高 ➝ allkeys-lfu
  • 仅对带 TTL 的 Key 举行优化 ➝ volatile-ttl / volatile-lfu

总结

Redis 接纳 LRU、LFU、TTL、随机淘汰等方式,适应不同场景,公道选择淘汰策略,可以提高 缓存掷中率数据管理效率

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万有斥力

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表