Redis 淘汰策略介绍

在 Redis 中,当使用内存超过设定的 maxmemory 限制时,Redis 会通过 淘汰策略(Eviction Policy)来删除某些数据,以便腾出内存空间。这些淘汰策略决定了当 Redis 达到内存限制时,哪些数据会被删除,从而保持 Redis 的正常运行。Redis 提供了多种淘汰策略,适用于不同的使用场景。

以下是常见的 Redis 淘汰策略:

1. noeviction(不淘汰数据)

策略描述

  • 当 Redis 达到最大内存限制时,不会删除任何数据。此时,如果有新的写入请求,Redis 会返回 OOM(Out Of Memory)错误。
  • 适用于某些要求保证数据完整性且不希望丢失任何数据的场景。

使用场景

  • 当你不希望 Redis 丢失任何数据,但在内存满时不允许系统继续工作时,可以选择此策略。

配置

bash复制代码maxmemory 2gb
maxmemory-policy noeviction

假设你有一个 Redis 用于存储重要的会话数据,并且要求不会丢失任何数据。如果 Redis 的内存达到 2GB,Redis 会拒绝新的写入操作,并返回错误,而不会删除任何现有的数据。此时需要根据错误做相应的处理,比如扩展 Redis 内存或优化数据存储。

2. allkeys-lru(LRU 最近最少使用)

策略描述

  • LRU(Least Recently Used) 策略删除 所有键 中最近最少使用的键。即优先删除最近最久没有被访问的数据。
  • 适用于缓存场景,能有效保留频繁访问的数据。

使用场景

  • 适用于热点数据较为明确,常访问的数据需要保留,其他不常用的数据可以删除的场景。

配置

maxmemory 2gb
maxmemory-policy allkeys-lru

假设你有一个 Redis 缓存用于存储电商网站的商品信息。在高峰期,一些商品被频繁访问,而其他商品很少被访问。使用 allkeys-lru 策略时,Redis 会优先删除那些较少被访问的商品信息,从而腾出空间给更多的热点商品信息。

3. volatile-lru(LRU 最近最少使用,仅删除设置了过期时间的数据)

策略描述

  • allkeys-lru 相似,但只会删除那些 设置了过期时间(TTL)的键。
  • 这种策略确保仅删除过期的数据,而保留没有过期时间的数据。

使用场景

  • 适用于只希望删除过期的缓存数据,而不希望删除长期存活的数据或关键数据。

配置

maxmemory 2gb
maxmemory-policy volatile-lru

假设你有一个 Redis 用于缓存用户会话数据,其中大部分数据都会过期。使用 volatile-lru 策略时,Redis 会删除最久未被访问的过期会话数据,而不会删除尚未过期的会话数据。这样可以保证活跃用户的会话不被删除。

4. allkeys-random(随机删除)

策略描述

  • 当 Redis 达到最大内存限制时,随机删除所有键(不论是否设置了过期时间)。
  • 适用于不关心数据的使用频率或重要性的场景。

使用场景

  • 适用于缓存数据对业务逻辑不敏感,删除数据不会造成严重后果的情况。

配置

maxmemory 2gb
maxmemory-policy allkeys-random

假设你有一个 Redis 缓存用于存储临时的用户浏览历史。使用 allkeys-random 策略时,Redis 会随机删除历史记录中的一些条目,无论这些记录是否过期。对于这种情况,数据的丢失不会影响业务流程,因此可以使用该策略。

5. volatile-random(随机删除设置了过期时间的数据)

策略描述

  • allkeys-random 相似,但只会删除 设置了过期时间(TTL)的键。
  • 适用于缓存数据,并且希望删除即将过期的数据,而保留长期存活的数据。

使用场景

  • 当你希望保证长期有效的数据不被删除,而缓存数据可以随机删除时使用此策略。

配置

maxmemory 2gb
maxmemory-policy volatile-random

假设你有一个 Redis 用于缓存商品的实时价格数据,并且这些价格会定期过期。使用 volatile-random 策略时,当 Redis 达到内存限制时,它会随机删除过期的商品价格数据,而不会影响那些没有过期的价格数据。

6. volatile-ttl(按 TTL(生存时间)删除)

策略描述

  • 当 Redis 达到最大内存限制时,优先删除剩余生存时间(TTL)最短的键
  • 适用于缓存数据,其中某些数据可能接近过期,删除这些数据不会造成较大影响。

使用场景

  • 当你希望优先删除那些即将过期的缓存数据,而保留剩余时间较长的数据时,可以使用此策略。

配置

maxmemory 2gb
maxmemory-policy volatile-ttl

假设你有一个 Redis 用于缓存短期活动的优惠券信息。这些优惠券有一个有效期,快到期的优惠券数据对业务价值较小,可以删除。使用 volatile-ttl 策略时,Redis 会优先删除剩余有效期最短的优惠券数据,从而保留那些有效期较长的优惠券数据。

Redis的碎碎念 文章被收录于专栏

Redis面试中的碎碎念

全部评论

相关推荐

不愿透露姓名的神秘牛友
01-13 20:33
美的集团 质量工程师 14k*14 硕士其他
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务