Redis内存使用合理规划指南
限制Redis使用的最大内存是避免系统内存耗尽的核心措施。建议将maxmemory设置为物理内存的70%-80%(如8GB物理内存可设为5.6-6.4GB),预留20%-30%给系统进程及其他应用,防止因Redis过度占用内存导致系统触发OOM Killer或使用Swap(严重影响性能)。可通过CONFIG SET maxmemory Xgb动态调整,无需重启服务。
当内存达到maxmemory时,需通过淘汰策略释放空间。常见策略及适用场景:
noeviction(禁止写入)仅适用于强一致性要求的场景(如数据库备份),生产环境建议选择LRU或TTL策略。Redis的不同数据结构内存开销差异大,选择合适结构可显著提升内存利用率:
HSET user:1 name "Tom" age 25)替代多个String(如SET user:1:name "Tom"、SET user:1:age 25),减少Key的数量及元数据(如类型、过期时间)的开销;hash-max-ziplist-entries(如512)、list-max-ziplist-size(如-2,表示元素≤64时用ziplist)等参数,将连续数据存储为紧凑的ziplist结构(内存占用约为常规结构的1/3-1/2);BigKey(如String大小>10KB、Hash/List元素数量>1万)会增加内存占用、延长操作时间(如删除一个10MB的String可能需要1秒,阻塞主线程)。优化措施:
product:1000:base、product:1000:inventory等Hash字段);将大Hash拆分为多个小Hash(如按时间分片order:202510:1、order:202510:2);长期运行中,Redis会因删除/修改操作产生内存碎片(mem_fragmentation_ratio>1.5表示碎片严重,需整理)。优化措施:
activedefrag yes,并调整阈值active-defrag-threshold-lower 10(碎片率>10%时启动)、active-defrag-threshold-upper 25(碎片率>25%时高优先级整理);jemalloc-bg-thread yes,启用后台线程回收空闲内存,减少碎片对内存的占用。对缓存数据设置合理的TTL(如商品详情TTL=1小时、会话数据TTL=30分钟),让Redis自动清理过期数据,防止内存无限增长。避免对长期不变的数据(如静态配置)设置过期时间,可通过EXPIRE key seconds或SETEX key seconds value命令设置。
通过INFO memory命令监控关键指标,判断内存使用是否合理:
used_memory_rss/used_memory>1.5,说明碎片严重);maxmemory或优化淘汰策略)。