当Redis内存达到上限时,可以通过以下方法快速释放内存:
- 执行KEYS *
命令找出大key(生产环境慎用,可能阻塞服务)
- 使用MEMORY USAGE key
检查具体内存占用
- 删除大key:DEL big_key
或 UNLINK big_key
(异步非阻塞)
- 设置过期时间:EXPIRE key seconds
- 修改maxmemory-policy策略(redis.conf):
conf
maxmemory-policy volatile-lru # 对设置了过期时间的key使用LRU淘汰
# 其他可选策略:
# allkeys-lru/allkeys-random/volatile-ttl等
- 使用scan命令分批删除(非阻塞):
bash
redis-cli --scan --pattern '*pattern*' | xargs redis-cli unlink
- 对于Hash/Set等大对象:
bash
# 分批删除hash字段
HSCAN big_hash 0 COUNT 100 | awk '{if($1~/^[0-9]+$/){skip=1}else{if(!skip){print $1}}' | xargs -L1 redis-cli HDEL big_hash
- 执行BGSAVE
将内存数据转储到RDB文件后重启
- 使用redis-cli --bigkeys
分析内存占用情况
- 设置合理的内存上限:
conf
maxmemory 16gb
maxmemory-samples 5 # LRU算法采样数
- 启用内存碎片整理(Redis 4.0+):
conf
activedefrag yes
注意事项:
1. 生产环境避免直接使用FLUSHDB/FLUSHALL
2. UNLINK
比DEL
更推荐(非阻塞)
3. 大key删除可能导致短暂延迟上升
4. 建议设置maxmemory
为物理内存的3/4
监控建议:
# 实时监控内存
redis-cli info memory | grep used_memory_human
# 查看key数量
redis-cli info keyspace
长期解决方案应考虑: - 集群分片 - 数据结构优化(如用多个小hash代替大hash) - 客户端缓存策略优化