Redis 内存之内存消耗

Redis所有的数据都存在内存中, 当前内存虽然越来越便宜, 但跟廉价的硬盘相比成本还是比较昂贵, 因此如何高效利用Redis内存变得非常重要。 高效利用Redis内存首先需要理解Redis内存消耗在哪里, 如何管理内存, 最后才能考虑如何优化内存。

 

内存消耗


理解Redis内存, 首先需要掌握Redis内存消耗在哪些方面。 有些内存消耗是必不可少的, 而有些可以通过参数调整和合理使用来规避内存浪费。 内存消耗可以分为进程自身消耗和子进程消耗。
 

内存使用统计


首先需要了解Redis自身使用内存的统计数据, 可通过执行info memory命令获取内存相关指标。 读懂每个指标有助于分析Redis内存使用情况, 表列举出内存统计指标和对应解释。
Redis 内存之内存消耗

Redis 内存之内存消耗

需要重点关注的指标有: used_memory_rss和used_memory以及它们的比值mem_fragmentation_ratio。
当mem_fragmentation_ratio>1时, 说明used_memory_rss-used_memory多出的部分内存并没有用于数据存储, 而是被内存碎片所消耗, 如果两者相差很大, 说明碎片率严重

当mem_fragmentation_ratio<1时, 这种情况一般出现在操作系统把Redis内存交换(Swap) 到硬盘导致, 出现这种情况时要格外关注, 由于硬盘速度远远慢于内存, Redis性能会变得很差, 甚至僵死。

 

内存消耗划分


Redis进程内消耗主要包括: 自身内存+对象内存+缓冲内存+内存碎片,其中Redis空进程自身内存消耗非常少, 通常used_memory_rss在3MB左右,used_memory在800KB左右, 一个空的Redis进程消耗内存可以忽略不计。Redis主要内存消耗如图8-1所示。 下面介绍另外三种内存消耗。

Redis 内存之内存消耗

1.对象内存
对象内存是Redis内存占用最大的一块, 存储着用户所有的数据。 Redis所有的数据都采用key-value数据类型, 每次创建键值对时, 至少创建两个类型对象: key对象和value对象。 对象内存消耗可以简单理解为sizeof(keys)+sizeof(values) 。 键对象都是字符串, 在使用Redis时很容易忽略键对内存消耗的影响, 应当避免使用过长的键。 value对象更复杂些, 主要包含5种基 本数据类型: 字符串、 列表、 哈希、 集合、 有序集合。 其他数据类型都是建立在这5种数据结构之上实现的, 如: Bitmaps和HyperLogLog使用字符串实现, GEO使用有序集合实现等。 每种value对象类型根据使用规模不同, 占用内存不同。 在使用时一定要合理预估并监控value对象占用情况, 避免内存溢出