Redis 内存优化与管理机制(内存碎片、LRU、惰性删除、内存回收策略)
Redis 内存优化与管理机制(内存碎片、LRU、惰性删除、内存回收策略)
1. 前言
Redis 是内存数据库,高性能的同时也面临 内存压力。
为了保证高效和稳定,Redis 设计了多层内存优化机制:
- 内存分配优化:Jemalloc 管理碎片
- 内存回收策略:引用计数 + 惰性删除
- 淘汰策略:LRU / LFU 控制数据量
- 内存上限管理:
maxmemory
配置
2. 内存碎片与分配优化
2.1 内存碎片
-
Redis 使用 Jemalloc 避免碎片化
-
内存碎片分为:
- 外部碎片:分配小块内存时,空闲块零散
- 内部碎片:分配大块内存时,未完全使用
2.2 Jemalloc 优势
- 按大小分级:不同大小对象分配不同内存池
- 减少系统调用:避免频繁
malloc/free
- 统计内存使用:Redis 可以通过
INFO memory
查看
2.3 Redis 内存监控
INFO memory
used_memory
:实际使用used_memory_rss
:操作系统分配内存mem_fragmentation_ratio
:碎片率
如果碎片率过高,可以考虑优化对象编码或升级 Redis。
3. LRU / LFU 淘汰策略
当 Redis 达到 maxmemory
限制时,需要 淘汰策略。
3.1 常用策略
策略 | 说明 |
---|---|
noeviction | 不淘汰,写操作返回错误 |
allkeys-lru | 全局 LRU 淘汰 |
volatile-lru | 只淘汰设置了过期时间的 key |
allkeys-lfu | 全局 LFU 淘汰 |
volatile-lfu | 只淘汰有过期时间的 key |
volatile-ttl | 淘汰 TTL 最短的 key |
3.2 LRU 原理
- Redis 使用 近似 LRU
- 不存储绝对访问时间,而是 16 位计数器
- 每次访问 key,会随机更新计数器
- 淘汰时随机扫描若干 key,选择计数最小的进行淘汰
3.3 源码分析
// expire.c
void activeExpireCycle(int type) {dict *dbdict = server.db[i].dict;for (j = 0; j < sample_size; j++) {key = randomKeyFromDict(dbdict);if (key.expired) deleteKey(key);}
}
Redis 并不扫描所有 key,而是 随机采样 + 淘汰最老,提高效率。
4. 惰性删除(Lazy Deletion)
4.1 概念
- Key 设置了过期时间后,并不会立即删除
- 访问时检查是否过期
- 访问到过期 key → 删除并返回空值
if (expireTime < now) deleteKey(c->db,key);
4.2 定期删除
- Redis 会周期性调用 activeExpireCycle() 清理过期 key
- 结合惰性删除和定期删除,保证内存不被过期 key 堵塞
5. 内存回收策略
Redis 内存回收机制依赖以下几层:
5.1 引用计数
robj.refcount
记录对象引用refcount == 0
→ 调用freeObject()
回收内存
5.2 惰性删除 + 定期删除
- 避免阻塞主线程
- 大对象删除时,可以使用 lazy free:后台异步释放
void freeObjAsync(robj *o) {if (o->type == OBJ_LIST || o->type == OBJ_SET)bioCreateBackgroundJob(BIO_LAZY_FREE, o);elsefreeObject(o);
}
5.3 内存上限控制
- 通过
maxmemory
配置限制 Redis 最大占用 - 达到上限 → 根据淘汰策略释放 key
6. 内存优化总结
Redis 内存优化体系包括:
- 内存分配优化:Jemalloc 减少碎片
- 引用计数 + 惰性删除:高效回收内存
- 淘汰策略(LRU / LFU / TTL):控制数据量
- 定期清理 + 异步释放:减少主线程阻塞
- 内存监控:
INFO memory
,碎片率控制
通过这些机制,Redis 能在 高并发 + 内存受限 环境下稳定运行。
7. 小结
本文分析了 Redis 内存优化与管理机制:
- 内存碎片管理:Jemalloc 提高分配效率,降低碎片率
- LRU / LFU 淘汰:高效管理内存上限
- 惰性删除 + 定期删除:过期 key 不占用过多资源
- 引用计数 + 异步释放:避免阻塞主线程
📌 结合前面数据结构、对象系统和事件驱动机制,Redis 的内存管理体系得以完整、高效、可靠。
下一篇可以写 Redis 高可用实战源码解析(Sentinel + Cluster 整合应用),把之前高可用理论、复制、持久化和内存机制整合成一个实战案例。