面试官问:Redis数据过多内存占满,会宕机吗?如何内存回收?

面试官问:Redis数据过多内存占满,会宕机吗?如何内存回收?
最新回答
七月别困

2024-01-19 01:40:05

Redis数据过多内存占满时,默认不会直接宕机,但会触发内存淘汰策略或返回错误,具体行为取决于配置的淘汰策略。内存回收通过预设的淘汰策略实现,以下是详细说明

一、内存占满时的行为
  1. 默认策略(noeviction)

    当内存达到maxmemory限制时,Redis会拒绝所有写请求(DEL和部分特殊请求除外),直接返回错误(如OOM command not allowed when used memory > maxmemory)。

    此策略可避免数据丢失,但需外部监控及时扩容或清理数据。

  2. 其他策略

    若配置了非noeviction策略(如LRU、LFU等),Redis会主动淘汰数据以释放内存,而非直接拒绝请求。

二、内存回收(淘汰策略)

Redis提供6种内存淘汰策略,通过maxmemory-policy配置:

  1. noeviction

    默认策略,内存满时拒绝写请求,适用于允许短暂阻塞的场景。

  2. volatile-lru

    设置了过期时间(TTL)的键中,使用LRU算法淘汰最近最少使用的键。

    适用场景:需保留热点数据且允许过期键被淘汰。

  3. allkeys-lru

    所有键中,使用LRU算法淘汰最近最少使用的键。

    适用场景:需全局优化内存使用,无特殊过期需求。

  4. volatile-random / allkeys-random

    分别从设置了TTL的键所有键中随机淘汰数据。

    适用场景:无热点数据特征,需快速释放内存。

  5. volatile-ttl

    设置了TTL的键中,优先淘汰剩余存活时间(TTL)最短的键。

    适用场景:需加速过期键清理的场景。

  6. LFU策略(Redis 4.0+)

    volatile-lfu:从设置了TTL的键中,淘汰访问频率最低的键。

    allkeys-lfu:从所有键中淘汰访问频率最低的键。

    适用场景:需基于访问频率优化内存,避免偶发访问的键被误保留。

三、配置与监控
  1. 设置最大内存

    通过配置文件:

    maxmemory 100mb # 限制内存为100MB

    通过命令行:

    config set maxmemory 100mb
  2. 设置淘汰策略

    通过配置文件:

    maxmemory-policy allkeys-lru

    通过命令行:

    config set maxmemory-policy allkeys-lru
  3. 监控内存使用

    使用INFO memory命令查看内存状态,关注以下字段:

    used_memory:已用内存。

    maxmemory:内存上限。

    evicted_keys:累计淘汰的键数量。

    示例输出:

    used_memory:899504maxmemory:104857600evicted_keys:0
四、LRU与LFU的实现细节
  1. 近似LRU算法

    Redis通过随机采样(默认5个键)模拟LRU,而非遍历所有键,以平衡性能与准确性。

    可通过maxmemory-samples调整采样数量(如maxmemory-samples 10),数值越大越接近严格LRU。

    Redis 3.0+优化:维护一个大小为16的候选池,按访问时间排序,淘汰最久未访问的键。

  2. LFU算法

    每个键记录24位访问频率和上次访问时间,频率每分钟衰减(避免长期不访问的键频率过高)。

    适用场景:数据访问模式稳定,需长期保留高频键。

五、最佳实践建议
  1. 根据业务选择策略

    缓存场景:优先选allkeys-lru或allkeys-lfu。

    混合场景(含过期键):选volatile-lru或volatile-lfu。

    随机访问:选allkeys-random或volatile-random。

  2. 合理设置maxmemory

    建议设置为物理内存的50%-70%,避免系统交换(Swap)导致性能下降。

  3. 监控与告警

    监控evicted_keys和used_memory,当淘汰键数量激增时及时扩容或优化策略。

  4. 避免noeviction陷阱

    若未配置淘汰策略且内存占满,写请求会持续失败,需确保监控覆盖此场景。

图:不同LRU采样数量下的淘汰准确性对比(浅灰色为淘汰键,灰色为保留老键,绿色为新键)

通过合理配置内存上限和淘汰策略,Redis可在内存紧张时优雅降级,避免宕机风险。