Redis内存优化与淘汰策略
Redis是内存数据库,内存是最宝贵的资源。当内存使用达到上限时,Redis会根据配置的淘汰策略(maxmemory-policy)删除部分数据。选择正确的淘汰策略,配合合理的数据结构设计,可以最大化Redis的利用效率。
内存使用分析
使用 redis-cli info memory 查看内存概况。关键指标:used_memory(实际使用内存)、used_memory_rss(操作系统分配的内存)、mem_fragmentation_ratio(内存碎片率,建议1-1.5之间)。
使用 redis-cli --bigkeys 扫描大Key(占用内存过大的Key)。大Key是内存浪费的常见原因,比如一个Hash存了几百万个字段,或者一个List有几万个元素。大Key应该拆分或迁移到专门的存储。
数据结构优化
Hash:当字段数少于128、值小于64字节时,Redis会使用ziplist编码,内存占用极小。超过阈值后转为hashtable,内存增加约3倍。所以尽量控制Hash的大小。
Set/ZSet:类似地,小数据量时使用intset/ziplist编码。设置 set-max-intset-entries 和 zset-max-ziplist-entries 控制阈值。
String:使用 SET key value EX seconds 设置过期时间,避免无用Key永久占用内存。对于计数器场景,使用 INCRBY 而非存储JSON。
淘汰策略
Redis支持8种淘汰策略,最常用的是:
- allkeys-lru:从所有Key中淘汰最近最少使用的。适合缓存场景(允许数据丢失)。
- volatile-lru:只从设置了过期时间的Key中淘汰。适合混合场景(部分数据需要持久化)。
- allkeys-lfu:淘汰最不经常使用的Key(Redis 4.0+)。比LRU更精准,推荐。
- noeviction:不淘汰,内存满时拒绝写入。适合不允许数据丢失的场景(但会导致写入失败)。
阿里云Redis特殊优化
阿里云Redis支持内存碎片自动整理,在控制台开启即可。支持代理模式(Cluster),数据自动分片到多个节点,单节点内存压力小。开启持久内存(AEP)实例可以进一步降低内存成本。
