Redis降低内存占用

Redis降低内存占用

降低redis的内存占用有助于减少创建快照和加载快照的时间,提高载入AOF文件和重写AOF文件的效率,缩短从服务器的同步时间,并且存储更多数据


短结构

Redis为集合、列表、散列、有序集提供了配置,可以让redis以更节约空间的方式存储长度较短的结构——压缩列表。
压缩列表是列表、散列、有序集的对象的一种非结构化表示。压缩列表以序列化的方式存储数据,每次读取都需要解码,每次写入都需要局部重新编码。

压缩列表

以列表list为例,列表是由双向链表实现的,它的每一个节点都包含了前指针后指针指向本节点数据的指针。本节点的数据含有三部分内容字符串长度字符串值中剩余可用字节数量以空字符串结尾的字符串本身
每个节点需要存储 3个指针 2个整数 字符串本身以及额外的结尾空字符。64位计算机中,除了字符串本身的长度,还需要额外占用41个字节。

压缩列表是由节点组成的队列,每个节点都是由两个长度值和一个字符串组成,第一个长度值记录上一个节点的长度,这个长度将被用于对压缩表进行从后向前的便利,第二个长度记录了当前节点的长度。将原本需要额外开销的41个字节减少到最多16个字节

可以使用list-max-ziplist-entries 512list-max-ziplist-value 64来配置列表会在什么情况使用压缩列表。entries表示压缩列表最大的元素数量,value表示压缩列表节点最大的体积。一旦超过任意一个限制,就会从压缩列表转换为列表。

可以使用DEBUG_OBJECT命令,了解一个对象是否被存储成压缩列表。

集合的整数集合编码

体积较小的集合,可以有自己的紧凑表示,如果存储内容可以用整数表示,并且数量足够少,那么redis会以有序整数数组的方式存储集合。这种存储方式被称为整数集合(intset)

set-max-intset-entries 512配置整数集合最大元素数量

长压缩列表和大整数集合带来的性能问题

当存储结构突破了限制条件时,redis就会把压缩列表和整数集合转换为底层数据结构,这是腰围经过压缩的结构体积越来越大,操作的速度也会越来越慢

分片结

分片在很多数据库中都使用这种技术来扩展存储空间并且提高自己的负载能力。 分片本质上就是基于某些简单的规则,将数据划分为更小的部分,然后根据数据所属的部分来决定将数据发送到哪个位置。

分片式散列