面试题:Redis 中有哪些内存淘汰策略?

Redis 是一种基于内存的键值存储系统,当内存不足时,需要通过 内存淘汰策略 来删除部分数据,以释放内存空间。Redis 提供了多种内存淘汰策略,可以根据业务需求进行配置。


1. Redis 内存淘汰策略的分类

Redis 的内存淘汰策略可以分为两类:

  1. 键空间淘汰策略:针对所有 key 进行淘汰。
  2. 过期键淘汰策略:针对设置了过期时间的 key 进行淘汰。

2. 键空间淘汰策略

键空间淘汰策略决定了当内存不足时,Redis 如何选择 key 进行删除。Redis 提供了 8 种键空间淘汰策略,可以通过配置文件中的 maxmemory-policy 参数设置。

2.1 noeviction(默认策略)

  • 规则:当内存不足时,新写入操作会报错,不会删除任何 key。
  • 适用场景:对数据一致性要求极高的场景,确保数据不会丢失。

2.2 allkeys-lru

  • 规则:从所有 key 中,选择最近最少使用(Least Recently Used, LRU)的 key 进行删除。
  • 适用场景:适合热点数据分布不均匀的场景。

2.3 volatile-lru

  • 规则:从设置了过期时间的 key 中,选择最近最少使用(LRU)的 key 进行删除。
  • 适用场景:适合对部分数据设置了过期时间的场景。

2.4 allkeys-random

  • 规则:从所有 key 中,随机选择 key 进行删除。
  • 适用场景:适合 key 的访问模式完全随机的场景。

2.5 volatile-random

  • 规则:从设置了过期时间的 key 中,随机选择 key 进行删除。
  • 适用场景:适合对部分数据设置了过期时间的场景。

2.6 volatile-ttl

  • 规则:从设置了过期时间的 key 中,选择剩余生存时间(Time To Live, TTL)最短的 key 进行删除。
  • 适用场景:适合优先淘汰即将过期的 key 的场景。

2.7 allkeys-lfu(Redis 4.0 引入)

  • 规则:从所有 key 中,选择最不常用(Least Frequently Used, LFU)的 key 进行删除。
  • 适用场景:适合访问频率差异较大的场景。

2.8 volatile-lfu(Redis 4.0 引入)

  • 规则:从设置了过期时间的 key 中,选择最不常用(LFU)的 key 进行删除。
  • 适用场景:适合对部分数据设置了过期时间的场景。

3. 过期键淘汰策略

过期键淘汰策略决定了 Redis 如何处理设置了过期时间的 key。Redis 提供了两种过期键淘汰策略,可以通过配置文件中的 maxmemory-policy 参数设置。

3.1 惰性删除(Lazy Expiration)

  • 规则:当客户端访问某个 key 时,Redis 会检查该 key 是否已过期,如果过期则删除。
  • 优点:节省 CPU 资源。
  • 缺点:可能导致大量过期 key 堆积,占用内存。

3.2 定期删除(Active Expiration)

  • 规则:Redis 会定期随机检查一部分设置了过期时间的 key,并删除已过期的 key。
  • 优点:减少过期 key 的内存占用。
  • 缺点:占用一定的 CPU 资源。

4. 如何选择内存淘汰策略?

选择内存淘汰策略时,需要根据业务场景和数据特点进行权衡:

  • 数据一致性要求高:选择 noeviction,确保数据不会丢失。
  • 热点数据分布不均匀:选择 allkeys-lruallkeys-lfu
  • 部分数据设置了过期时间:选择 volatile-lruvolatile-lfuvolatile-ttl
  • key 访问模式随机:选择 allkeys-randomvolatile-random

5. 配置内存淘汰策略

在 Redis 配置文件 redis.conf 中,可以通过以下参数设置内存淘汰策略:

maxmemory <bytes>          # 设置 Redis 最大内存限制
maxmemory-policy <policy>  # 设置内存淘汰策略

例如:

maxmemory 1gb
maxmemory-policy allkeys-lru

6. 内存淘汰策略的注意事项

  • 监控内存使用:通过 INFO memory 命令监控 Redis 的内存使用情况。
  • 合理设置最大内存:根据服务器的物理内存和业务需求,合理设置 maxmemory
  • 结合持久化策略:如果开启了持久化(如 RDB 或 AOF),需要确保内存淘汰策略不会影响数据的一致性。

总结

Redis 提供了多种内存淘汰策略,可以根据业务需求选择合适的策略:

  • 默认策略noeviction,确保数据不会丢失。
  • LRU 策略allkeys-lruvolatile-lru,适合热点数据分布不均匀的场景。
  • LFU 策略allkeys-lfuvolatile-lfu,适合访问频率差异较大的场景。
  • 随机策略allkeys-randomvolatile-random,适合 key 访问模式随机的场景。
  • TTL 策略volatile-ttl,适合优先淘汰即将过期的 key 的场景。

通过合理配置内存淘汰策略,可以有效管理 Redis 的内存使用,避免内存不足导致的性能问题。

THE END
点赞13 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容