插件窝 干货文章 Redis内存满了如何快速释放内存?

Redis内存满了如何快速释放内存?

内存 Redis 阻塞 maxmemory 243    来源:    2025-03-28

当Redis内存达到上限时,可以通过以下方法快速释放内存:

  1. 立即解决方案(快速释放内存)

- 执行KEYS *命令找出大key(生产环境慎用,可能阻塞服务) - 使用MEMORY USAGE key检查具体内存占用 - 删除大key:DEL big_keyUNLINK big_key(异步非阻塞)

  1. 配置优化方案

- 设置过期时间:EXPIRE key seconds - 修改maxmemory-policy策略(redis.conf): conf maxmemory-policy volatile-lru # 对设置了过期时间的key使用LRU淘汰 # 其他可选策略: # allkeys-lru/allkeys-random/volatile-ttl等

  1. 高级处理方案

- 使用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

  1. 持久化方案

- 执行BGSAVE将内存数据转储到RDB文件后重启 - 使用redis-cli --bigkeys分析内存占用情况

  1. 预防性措施

- 设置合理的内存上限: conf maxmemory 16gb maxmemory-samples 5 # LRU算法采样数 - 启用内存碎片整理(Redis 4.0+): conf activedefrag yes

注意事项: 1. 生产环境避免直接使用FLUSHDB/FLUSHALL 2. UNLINKDEL更推荐(非阻塞) 3. 大key删除可能导致短暂延迟上升 4. 建议设置maxmemory为物理内存的3/4

监控建议:

# 实时监控内存
redis-cli info memory | grep used_memory_human
# 查看key数量
redis-cli info keyspace

长期解决方案应考虑: - 集群分片 - 数据结构优化(如用多个小hash代替大hash) - 客户端缓存策略优化