目录
一、介绍
二、核心前提:内存上限配置(maxmemory)
三、内存淘汰的核心逻辑
四、Redis 内存淘汰策略
一、介绍
- Redis 内存淘汰:原理、策略、配置与最佳实践
- Redis 是内存数据库,所有数据都存储在内存中,而内存资源有限。当 Redis 占用的内存达到预设上限(maxmemory)时,若再接收新的写请求(如 SET、INCR),就需要通过内存淘汰机制清理部分数据,释放内存空间,确保服务正常运行。
- 核心目标:在内存不足时,优先保留 “最有价值” 的数据,淘汰 “无用 / 低价值” 数据,避免因内存溢出导致服务崩溃或写请求失败。
二、核心前提:内存上限配置(maxmemory)
内存淘汰的触发条件是「Redis 已用内存 ≥ maxmemory」,因此需先通过配置指定内存上限:
配置文件 redis.conf(永久生效)
maxmemory 4gb # 限制 Redis 最大使用内存为 4GB(支持 kb/mb/gb 单位)
- 默认值:Redis 6.2+ 版本默认 maxmemory 0(不限制内存,会持续占用内存直到系统内存耗尽,不推荐线上使用);
- 建议值:根据物理内存配置,通常设为物理内存的 70%-80%(如 8GB 物理内存设为 6GB),预留内存给操作系统和 Redis 其他进程(如持久化子进程)。
动态修改(临时生效,重启后失效)
127.0.0.1:6379> CONFIG SET maxmemory 4gb # 动态设置内存上限
OK
127.0.0.1:6379> CONFIG GET maxmemory # 查看当前内存上限
1) "maxmemory"
2) "4294967296" # 单位为字节(4GB = 4*1024*1024*1024)
未设置 maxmemory 的风险
- 若不限制内存,Redis 会持续存储数据,直到:
- 系统内存耗尽,触发操作系统的 OOM(Out Of Memory)杀死 Redis 进程;
- 服务器因内存压力过大,导致 Redis 响应延迟飙升,甚至服务不可用。
三、内存淘汰的核心逻辑
当 Redis 接收写请求时,执行流程如下:
- 计算当前已用内存(used_memory)是否 ≥ maxmemory;
- 若未超过:直接执行写请求;
- 若已超过:根据配置的「淘汰策略」选择待淘汰的数据;
- 删除选中的数据(释放内存),并触发对应键的过期回调(若有)、持久化日志(如 AOF 记录 DEL 命令);
- 执行当前写请求。
注意
注意:淘汰仅针对「写请求」触发(SET、HMSET、INCR 等),读请求(GET、HGET)不会触发淘汰。
四、Redis 内存淘汰策略
Redis 提供 8 种淘汰策略(Redis 4.0+ 新增 2 种 LFU 策略),按「淘汰范围」和「筛选规则」可分为 3 大类:
分类 1:仅淘汰「已过期」的键(过期键集合:设置了 EXPIRE/TTL 的键)

分类 2:淘汰「所有键」(包括过期键和未过期键)

分类 3:不淘汰任何键(拒绝写请求)

本文作者:松轩(^U^)
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA
许可协议。转载请注明出处!