Redis 内存优化

面试官问:"Redis 内存使用率高怎么办?"

小陈说:"加内存。"

面试官追问:"除了加内存,还有什么办法?"

小陈说:"...减少 key?"

面试官继续追问:"Big Key 怎么处理?"

小陈答不上来。

Redis 内存优化是生产环境中的高频问题。这道题能说清楚内存碎片、Big Key 诊断和小对象优化的候选人,对 Redis 内存管理有实战经验。

一、内存使用分析 🔴

1.1 INFO memory 解读

INFO memory
# used_memory_human: 10G          # Redis 实际分配的内存
# used_memory_rss_human: 12G       # 操作系统报告的内存占用(含碎片)
# mem_fragmentation_ratio: 1.20   # 碎片率 = rss / used
# mem_fragmentation_ratio < 1.5    # 正常
# mem_fragmentation_ratio > 1.5    # 碎片严重

# maxmemory_human: 16G             # maxmemory 配置
# maxmemory_policy: allkeys-lru     # 淘汰策略

1.2 内存占用分析

-- 分析 key 占用
redis-cli --bigkeys
# 列出每种类型最大的 key

-- 分析 key 数量
redis-cli DBSIZE

-- 分析 key 大小分布
redis-cli --scan --pattern '*' | head -1000 | xargs redis-cli MEMORY USAGE

二、内存碎片 🟡

2.1 碎片原因

-- 内存碎片产生原因:
-- 1. 频繁更新 key-value,value 大小变化
--    SET key "hello" → SET key "hello world"
-- 2. 大量删除 key
-- 3. 超过 maxmemory 后的数据淘汰

2.2 碎片处理

-- 方法 1:重启 Redis(治本)
-- 碎片内存被完全回收

-- 方法 2:MEMORY PURGE(Redis 4.3+,治标)
MEMORY PURGE
# 触发内存碎片整理

-- 方法 3:调整 maxmemory-policy
# 让淘汰策略回收碎片空间

-- 方法 4:惰性删除
lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes

三、Big Key 处理 🟡

3.1 Big Key 诊断

# 使用 redis-cli --bigkeys
redis-cli --bigkeys

# 输出示例:
# 整理了 12345 个 keys
# String 最大的 key: "big:string" (100MB)
# List 最大的 key: "big:list" (2000000 个元素)
# Hash 最大的 key: "big:hash" (50000 个字段)

3.2 Big Key 的危害

-- Big Key 的问题:
-- 1. 单次操作时间过长(GET big:string 100MB → 阻塞)
-- 2. 内存分配不均匀
-- 3. 删除 Big Key 阻塞(Redis 6.2+ 支持ASYNC 删除)

-- 删除时间:
-- String 100MB → 约 100ms
-- List 1000万元素 → 约 10 秒

-- Redis 6.2+ 异步删除:
UNLINK bigkey  -- 异步删除,不阻塞

3.3 Big Key 优化

-- 优化方案:
-- 1. 拆分大对象
--    Big Hash → 多个小 Hash
--    big:user:100:data → user:100:data:1, user:100:data:2, ...

-- 2. 压缩字符串
--    如果 value 是文本,压缩后再存
--    GET value → 解压 → 使用

-- 3. 分批处理
--    LRANGE biglist 0 1000
--    LRANGE biglist 1001 2000
--    ...

四、小对象压缩 🟡

4.1ziplist 优化

-- Hash/List/ZSet 使用 ziplist 存储小对象
-- 节省内存

-- 调整阈值(redis.conf):
hash-max-ziplist-entries 512   # 默认 512
hash-max-ziplist-value 64     # 默认 64 字节

# 小字段 +value = ziplist
# 大字段/value = hashtable/list

4.2 整数优化

-- Redis 对小整数有优化:
-- 整数 0~9999 被 Redis 内部共享
-- SET num 100 → 不额外分配新对象,复用共享对象

-- 使用整数代替字符串:
# ❌ SET user:1:age "25"   # 字符串对象
# ✅ SET user:1:age 25      # 整数对象

五、生产调优 🟢

5.1 内存配置建议

# redis.conf 内存配置
maxmemory 8gb                    # 最大内存
maxmemory-policy allkeys-lru     # 淘汰策略
lazyfree-lazy-eviction yes        # 异步淘汰
lazyfree-lazy-expire yes         # 异步过期

5.2 内存监控告警

# 设置告警规则(Prometheus + Redis Exporter)
ALERT memory_fragmentation > 1.5
ALERT memory_used_percent > 80
ALERT evicted_keys > 1000

【面试官心理】 Redis 内存优化是生产环境中的重要话题。能说清楚内存碎片、Big Key 诊断和小对象优化的候选人,说明他对 Redis 生产运维有实战经验。


级别考察重点期望回答
P5基本概念INFO memory 解读
P6优化方法内存碎片、Big Key
P7生产调优阈值调整、异步删除、监控告警