跳到主要内容

Redis 内存淘汰

1. 过期删除策略​

  • Redis 为管理内存,对设置了过期时间的键采用了以下三种删除策略:

1.1 定期删除​

  • 描述:每隔一定时间扫描 expires 字典中的部分键,清除过期键。
  • 优点:折中策略,通过调整扫描时间间隔和每次扫描数量,平衡 CPU 和内存资源。

1.2 定时删除​

  • 描述:为每个设置了过期时间的键创建一个定时器,到达过期时间立即清除。
  • 优点:对内存很友好,过期数据能及时清除。
  • 缺点:需要消耗大量的 CPU 资源来处理定时器,影响缓存响应时间和吞吐量。

1.3 惰性删除​

  • 描述:只有在访问某个键时才判断其是否过期,过期则清除。
  • 优点:最大化节省 CPU 资源。
  • 缺点:可能会有大量过期键未被访问而占用内存。

默认使用惰性过期 (Lazy Expiration)和定期删除 (Periodic Deletion) 两者结合的方式,能够在性能和内存使用之间找到一个良好的平衡。

2. 内存淘汰机制​

  • Redis 可以通过参数 maxmemory 设置内存最大限制,从而避免 Redis 占满机器的内存,影响其他服务。
  • 默认值:
    • maxmemory=0,表示没有限制。
    • 在 32 位系统 上,Redis 最大支持内存为 3GB(32 位系统最大内存为 4GB)。
    • 在 64 位系统 上,Redis 的最大内存限制为物理机的可用内存。

当内存达到 maxmemory 限制时,Redis 会按照 maxmemory-policy 启动相应的淘汰策略,Redis 默认的内存淘汰策略是:noeviction。

2.1 针对设置了过期时间的键​

  • volatile-lru:仅对设置了过期时间的键,淘汰最近最少使用的键。
  • volatile-ttl:仅对设置了过期时间的键,淘汰剩余时间最短的键。
  • volatile-random:仅对设置了过期时间的键,随机淘汰。
  • volatile-lfu:仅对设置了过期时间的键,淘汰访问频率最低的键。

2.2 针对所有键​

  • allkeys-lru:对所有键,淘汰最近最少使用的键。
  • allkeys-random:对所有键,随机淘汰。
  • allkeys-lfu:对所有键,淘汰访问频率最低的键。

2.3 无淘汰策略​

  • noeviction:不进行淘汰,当内存超限时直接返回错误。