暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis内存管理与淘汰策略相关知识

wulinyu 2025-06-06
73

Redis 是一个内存数据库,它所有的数据都存放在内存中,因此**内存管理和淘汰策略(Eviction Policy)**对于 Redis 的稳定运行至关重要。下面将从 DBA 运维角度,结合配置参数和真实使用场景,系统介绍相关知识。

 一、Redis 的内存管理机制

Redis 使用内存来存储:

  • 所有 key 和 value 数据;

  • AOF 缓冲区(如果开启);

  • 客户端连接对象;

  • Lua 脚本缓存;

  • 复制缓冲区;

  • Pub/Sub 消息等。

默认情况下,Redis 不限制最大内存,直到系统内存耗尽,导致 OOM。

因此运维上必须通过配置 maxmemory 参数为 Redis 设置内存上限。

 示例:

maxmemory 2gb

 二、当内存达到上限会发生什么?

当达到 maxmemory 限制后:

  • 若执行只读命令(如 GET),Redis 继续正常工作;

  • 若执行写命令(如 SET、LPUSH、ZADD),Redis 会尝试通过**“数据淘汰”**来释放内存;

  • 如果没有可淘汰数据或策略不允许淘汰,则返回错误(例如:OOM command not allowed when used memory > 'maxmemory')。

 三、Redis 数据淘汰策略(maxmemory-policy)

配置参数:maxmemory-policy

用于定义当 Redis 内存达到上限时,如何淘汰数据。

 可选策略如下(来自官方文档):

策略名 说明 场景
noeviction 默认策略,不淘汰数据,写命令报错 高安全性场景(例如缓存重要数据)
allkeys-lru 从所有 key 中,淘汰最近最少使用的 key(LRU) 通用缓存
volatile-lru 从设置了过期时间的 key 中淘汰 LRU 配合缓存失效控制
allkeys-random 所有 key 中随机淘汰 少见,一般不用
volatile-random 设置了过期时间的 key 中随机淘汰 少见
volatile-ttl 淘汰即将过期的 key(TTL 值最小) 适用于时间敏感缓存
allkeys-lfu 从所有 key 中淘汰使用频率最低的 key(LFU) 更智能,推荐 Redis 4.0+ 使用
volatile-lfu 设置了过期时间的 key 中淘汰使用频率最低的 key 智能+时间双重控制

 Redis 4.0 引入 LFU 策略(Least Frequently Used),比 LRU 更精细。

 示例配置:

maxmemory-policy allkeys-lru

 四、如何观察 Redis 内存使用情况?

使用命令:

INFO memory

输出包含:

used_memory:10123456          # 实际使用内存(字节)
used_memory_human:9.65M       # 人类可读
maxmemory:2147483648          # 配置的上限
mem_fragmentation_ratio:1.15  # 内存碎片率(>1.2 需关注)

 分析淘汰情况:

INFO stats

观察:

evicted_keys:4567   # 被淘汰 key 的总数量(累计值)
keyspace_hits:...
keyspace_misses:...

 五、LFU/LRU 实现原理简析(适合 DBA 理解)

 LRU(Least Recently Used)

Redis 为每个 key 维护一个 LRU 时间戳,基于时间戳选择淘汰对象。并非精确 LRU,而是采样近似算法(省内存 + 高性能)。

 LFU(Least Frequently Used)

Redis 为每个 key 维护一个 8-bit 使用频率计数器 counter(最多 255)。通过指数衰减算法定期降低频率,优先淘汰“很少使用”的 key。

配置:

maxmemory-policy allkeys-lfu
lfu-log-factor 10             # 控制频率计数器增长速率
lfu-decay-time 1              # 每分钟衰减一次频率

 六、实际运维建议

 推荐配置示例(缓存场景):

maxmemory 2gb
maxmemory-policy allkeys-lfu

 数据安全场景:

maxmemory 0          # 不限制内存
appendonly yes       # 开启 AOF
maxmemory-policy noeviction

 辅助工具:

  • redis-cli 中可用 MEMORY USAGE keyname 精确查看某 key 的内存占用;

  • 使用 MEMORY STATS 查看 Redis 全局内存分布;

  • 使用 redis_exporter+Prometheus+Grafana 做内存监控与告警。

 小结(DBA 必知重点)

项目 建议
是否开启内存上限  设置 maxmemory
淘汰策略推荐 allkeys-lfuvolatile-lfu
内存监控 INFO memory + evicted_keys
大 key 排查 MEMORY USAGE keyname
Redis 作为缓存使用时 maxmemory + 淘汰策略必须配置

如需我为你生成一份适用于生产 Redis 的 redis.conf 片段(结合你机器内存情况),或者你想了解 Redis 如何定位大 key、慢 key,可以继续告诉我。也可以继续深入理解 Redis 的内存分配器 jemalloc 与性能优化方法

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论