redis内存淘汰机制

redis内存淘汰机制
最新回答
真心可是半斤ぴ

2021-03-09 13:59:26

Redis内存淘汰机制是当内存使用达到maxmemory限制时,通过特定策略自动清理数据以释放内存,确保服务可用性。 以下是详细说明:

一、内存限制设置
  • 配置方式

    文件配置:在redis.conf中通过maxmemory 100mb设置最大可用内存(示例为100MB)。

    动态修改:通过命令config set maxmemory 100mb实时调整,或config get maxmemory查询当前值。

  • 默认行为

    若未设置或设为0,64位系统不限制内存,32位系统限制为3GB。

二、淘汰策略分类1. 默认策略:noeviction
  • 行为:禁止写入(除DEL及部分特殊命令),直接返回错误。
  • 适用场景:需保证数据不丢失,但可能引发服务阻塞。
2. LRU(最近最少使用)
  • allkeys-lru:从所有键中淘汰最近最少使用的数据。
  • volatile-lru:仅从设置了过期时间的键中淘汰最近最少使用的数据。
  • 实现方式

    Redis采用近似LRU算法,通过随机采样(默认5个键)选择淘汰对象,而非严格遍历所有键。

    每个键增加24位字段记录最后访问时间,采样时比较访问时间。

  • 优化(Redis 3.0+)

    维护一个大小为16的候选池,按访问时间排序。

    新采样键若访问时间更早则加入池中,替换最久未访问的键;淘汰时直接选择池中最早访问的键。

  • 参数调整:通过maxmemory-samples 10增加采样数量(默认5),结果更接近严格LRU,但增加计算开销。
3. 随机淘汰
  • allkeys-random:从所有键中随机淘汰数据。
  • volatile-random:仅从设置了过期时间的键中随机淘汰。
  • 特点:实现简单,但无法保证淘汰数据的合理性,适用于对缓存命中率要求不高的场景。
4. TTL(过期时间优先)
  • volatile-ttl:根据键的剩余生存时间(TTL)淘汰,越早过期的键越优先被删除。
  • 适用场景:需优先清理即将过期的数据,如临时会话管理。
5. LFU(最近最不常用,Redis 4.0+)
  • allkeys-lfu:从所有键中淘汰访问频率最低的数据。
  • volatile-lfu:仅从设置了过期时间的键中淘汰访问频率最低的数据。
  • 实现方式

    每个键记录访问频率(计数器),通过衰减机制避免旧数据长期占用计数器。

    淘汰时选择频率最低的键,若频率相同则参考访问时间。

  • 优势:更适合访问模式稳定的场景(如热点数据频繁访问)。
三、策略选择建议
  • 高缓存命中率需求:优先选择allkeys-lru或allkeys-lfu(Redis 4.0+)。
  • 需保留未过期数据:使用volatile-lru、volatile-random或volatile-ttl。
  • 简单场景:allkeys-random或volatile-random可降低计算开销。
  • 数据一致性优先:noeviction避免数据丢失,但需监控内存使用。
四、注意事项
  1. 策略兼容性

    volatile-lfu和allkeys-lfu仅支持Redis 4.0及以上版本,低版本设置会报错。

  2. 淘汰失败处理

    使用volatile-lru、volatile-random或volatile-ttl时,若无符合条件的键可淘汰,行为与noeviction一致(返回错误)。

  3. 性能影响

    增加maxmemory-samples可提升LRU准确性,但会提高CPU占用。

  4. 监控与调优

    通过INFO memory命令监控内存使用情况,结合业务特点调整策略和参数。

五、配置示例# 设置最大内存为1GB127.0.0.1:6379> config set maxmemory 1gb# 选择淘汰策略为allkeys-lru127.0.0.1:6379> config set maxmemory-policy allkeys-lru# 调整LRU采样数量为10127.0.0.1:6379> config set maxmemory-samples 10

通过合理配置内存限制和淘汰策略,Redis可在资源受限环境下保持高性能运行,满足不同业务场景的需求。