Redis 的内存回收机制详解

Redis 的内存回收机制详解

Redis 是基于内存的高性能数据库,但内存资源有限。当单节点内存过大时,不仅会增加成本,还可能影响 RDB/AOF 持久化主从同步 的性能与稳定性。

为此,Redis 提供了完善的内存管理机制,主要包括两类策略:

  • 过期策略(Expiration Policy):自动清理设置了 TTL 的过期数据
  • 淘汰策略(Eviction Policy):在内存达到上限时,主动移除部分数据以腾出空间

一、内存上限配置

通过 redis.conf 设置最大内存限制:

conf 复制代码
maxmemory 1gb

💡 若未设置,32 位系统默认为 3GB,64 位系统默认无限制(直到耗尽物理内存)。

当内存使用达到 maxmemory 时,Redis 将根据 maxmemory-policy 配置的策略决定如何处理新写入请求。


二、过期策略(针对带 TTL 的 Key)

Redis 允许为每个 key 设置生存时间(TTL, Time To Live),到期后自动失效。

1. 设置 TTL 的方式

bash 复制代码
# 方式1:先 set,再 expire
SET k1 value1
EXPIRE k1 20          # 20 秒后过期

# 方式2:set 时直接指定(推荐)
SET k1 value1 EX 20   # EX = seconds

支持单位:EX(秒)、PX(毫秒)、EXAT(绝对 Unix 时间戳)、PXAT 等。

2. 过期判断机制

Redis 内部维护一个 过期字典(expires dict),以 key 为键、过期时间为值。通过比对当前时间与过期时间,判断 key 是否失效。

3. 过期 key 的删除策略

Redis 采用 惰性删除 + 定期删除 相结合的方式,平衡 CPU 与内存开销:

✅ 惰性删除(Lazy Expiration)
  • 触发时机:当客户端访问某个 key 时
  • 行为 :先检查是否过期,若过期则删除并返回 nil
  • 优点:CPU 友好
  • 缺点:过期 key 可能长期驻留内存
✅ 定期删除(Active Expiration)
  • 触发频率 :每秒执行 10 次
  • 过程
    1. 随机抽取 20 个 带 TTL 的 key
    2. 删除其中已过期的 key
    3. 若过期 key 比例 > 25%,则立即开启下一轮扫描(最多 25 轮/秒)
  • 目的:防止大量过期 key 积压,导致内存浪费

📌 两者互补:惰性保证最终一致性,定期控制内存水位。


三、内存淘汰策略(Eviction Policy)

即使所有 key 都未过期,内存仍可能被占满。此时,Redis 会根据 maxmemory-policy 配置主动淘汰数据。

1. 配置方式

conf 复制代码
maxmemory-policy allkeys-lru

2. 淘汰策略详解

策略 作用范围 淘汰依据 适用场景
noeviction --- 不淘汰,写入报错 (error) OOM 默认策略,适用于不允许丢失数据的场景
volatile-ttl 仅带 TTL 的 key 剩余存活时间最短(最先过期) 缓存类数据,希望优先删快过期的
volatile-random 仅带 TTL 的 key 随机删除 简单场景,无明确访问模式
volatile-lru 仅带 TTL 的 key LRU(最近最少使用) 带 TTL 的热点缓存
volatile-lfu 仅带 TTL 的 key LFU(最少频繁使用) Redis 4.0+,识别长期低频访问
allkeys-random 所有 key 随机删除 key 访问均匀,无热点
allkeys-lru 所有 key LRU(最近最少使用) 最常用,通用缓存场景
allkeys-lfu 所有 key LFU(最少频繁使用) Redis 4.0+,识别冷数据

🔑 LRU vs LFU

  • LRU(Least Recently Used):最近没用过的优先淘汰
  • LFU(Least Frequently Used):历史上使用频率最低的优先淘汰(更抗突发流量)

四、最佳实践建议

  1. 合理设置 maxmemory:建议预留 20%~30% 内存给操作系统和其他进程
  2. 优先使用 allkeys-lruallkeys-lfu:适用于大多数缓存场景
  3. 避免依赖 noeviction:除非业务强要求"写入必须成功"
  4. 监控内存使用 :通过 INFO memory 查看 used_memoryevicted_keys 等指标
  5. TTL + 淘汰策略结合使用:双重保障内存可控

总结

Redis 通过 过期策略 清理"时间到期"的数据,通过 淘汰策略 应对"内存不足"的压力。二者协同工作,既保证了高性能,又实现了内存的自动回收与管理。

📌 提示:淘汰策略 不会触发持久化,被删除的数据将永久丢失,请根据业务容忍度选择合适策略。


作者:不会写程序的未来程序员

首发于 CSDN

版权声明:本文为原创文章,转载请注明出处。

相关推荐
Rain的Java大神之路6 小时前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
十二同学啊6 小时前
向量数据库:从核心原理到 RAG 与 Java 实战
数据库
Wang's Blog6 小时前
Java 接入Redis: 通用命令与键管理
java·服务器·redis
Wang's Blog6 小时前
Java 接入Redis: 列表集合与有序集合操作命令
java·服务器·redis
蓝速科技7 小时前
会议室门牌公告通知发布选型与落地指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
Together_CZ7 小时前
DeepSeek-V4.1-Flash:Pushing the Limits of KV Cache Compression——推动 KV 缓存压缩的极限
缓存·llm·compression·kv cache·deepseek·v4.1-flash·推动 kv 缓存压缩的极限
一 乐9 小时前
二手交易平台|基于springboot + vue二手交易平台(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序
SelectDB10 小时前
同等资源下 Apache Doris 4.2 vs StarRocks 4.1.1:1TB SSB 与 TPC-H 性能实测
大数据·数据库·数据分析
这个DBA有点耶10 小时前
数据库集群与分布式架构:三条技术路线对比、金仓KES RAC实测数据与决策框架
数据库·程序员·架构
MayBaymax10 小时前
MongoDB 索引与事务
java·数据库·mongodb