Redis内存优化与淘汰策略

孙前端

· 阅读 1921

分享
Redis内存优化

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-entrieszset-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)实例可以进一步降低内存成本。