编辑
2025-11-21
redis
00

目录

一、介绍
二、核心前提:内存上限配置(maxmemory)
三、内存淘汰的核心逻辑
四、Redis 内存淘汰策略

一、介绍

  • Redis 内存淘汰:原理、策略、配置与最佳实践
  • Redis 是内存数据库,所有数据都存储在内存中,而内存资源有限。当 Redis 占用的内存达到预设上限(maxmemory)时,若再接收新的写请求(如 SET、INCR),就需要通过内存淘汰机制清理部分数据,释放内存空间,确保服务正常运行。
  • 核心目标:在内存不足时,优先保留 “最有价值” 的数据,淘汰 “无用 / 低价值” 数据,避免因内存溢出导致服务崩溃或写请求失败。

二、核心前提:内存上限配置(maxmemory)

内存淘汰的触发条件是「Redis 已用内存 ≥ maxmemory」,因此需先通过配置指定内存上限:

配置文件 redis.conf(永久生效)

js
maxmemory 4gb # 限制 Redis 最大使用内存为 4GB(支持 kb/mb/gb 单位)
  • 默认值:Redis 6.2+ 版本默认 maxmemory 0(不限制内存,会持续占用内存直到系统内存耗尽,不推荐线上使用);
  • 建议值:根据物理内存配置,通常设为物理内存的 70%-80%(如 8GB 物理内存设为 6GB),预留内存给操作系统和 Redis 其他进程(如持久化子进程)。

动态修改(临时生效,重启后失效)

js
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 接收写请求时,执行流程如下:

  1. 计算当前已用内存(used_memory)是否 ≥ maxmemory;
  2. 若未超过:直接执行写请求;
  3. 若已超过:根据配置的「淘汰策略」选择待淘汰的数据;
  4. 删除选中的数据(释放内存),并触发对应键的过期回调(若有)、持久化日志(如 AOF 记录 DEL 命令);
  5. 执行当前写请求。

注意

注意:淘汰仅针对「写请求」触发(SET、HMSET、INCR 等),读请求(GET、HGET)不会触发淘汰。

四、Redis 内存淘汰策略

Redis 提供 8 种淘汰策略(Redis 4.0+ 新增 2 种 LFU 策略),按「淘汰范围」和「筛选规则」可分为 3 大类:

分类 1:仅淘汰「已过期」的键(过期键集合:设置了 EXPIRE/TTL 的键)

image.png

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

image.png

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

image.png

本文作者:松轩(^U^)

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

Document