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面试中的碎碎念