redis 的数据结构和内部编码

首先,从网上找来一张图片镇楼

redis 的数据结构和内部编码_第1张图片

redis对外展现五种数据类型,string(字符串),hash(哈希)、list(列表)、set(集合)、zset(有序集合)。每种数据结构,redis都提供了不同的内部编码实现方式(内部编码可以通过object encoding key查看),以便使用不同的场景 

1、string

1)int:8个字节的长整型,如果一个字符串保存的类型是整数值,并且这个值可以 用long类型来表示,name字符串对象会将整数值保存在字符串对象结构的ptr属性里面,并将字符串对象的编码设置为int。

2)embstr:小于等于39个字节的字符串,embstr编码是专门用于保存短字符串的优化编码方式。相比raw有如下好处:

A、embstr编码将创建字符串对象所需的空间分配的次数从raw编码的两次降低为一次。

B、释放embstr编码的字符串对象只需要调用一次内存释放函数,而释放raw编码对象的字符串对象需要调用两次内存释放函数

C、因为embstr编码的字符串对象的所有数据都保存在一块连续的内存里面,所以这种编码的字符串对象比起raw编码的字符串对象能更好地利用缓存带来的优势。

3)raw:大于39个字节的字符串,用简单动态字符串(SDS)来保存,将这个字符串的对象编码设置为raw。

ps:

sds相比传统字符串的优点:因为保存了长度字段常o(1)时间复杂度获取字符串长度;杜绝缓冲区溢出;减少修改字符串时带来的内存重分配次数;

2、哈希的内部编码

1)ziplist(压缩列表):当哈希类型元素小于has-max-ziplist-entries配置(默认512个),同事所有值都小于hash-max-ziplist-value配置(默认64个字节)时,redis会使用ziplist作为哈希的内部实现。ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀

2)hashtable(哈希表):当哈希类型无法满足ziplist的条件时,redis会使用hashtable作为哈希的内部实现。因为ziplist的读写效率会下降,而hashtable的读写时间复杂度为o(1)

3、列表的内部编码

1)ziplist(压缩列表)

2)linkedlist(链表):当列表类型无法满足条件的时候,redis会使用linkedlist作为列表的内部实现

4、集合

1)intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)是,redis会选intset作为集合的内部实现,从而减少内存使用

2)hashtable:当集合元素无法满足intset的条件时,redis会使用hashtable作为集合的内部实现

5、zset有序集合的内部编码

1)ziplist:

2)skiplist(跳跃表):当ziplist条件不满足的时候,有序集合会使用skiplist作为内部 实现,因为ziplist的读写效率会下降


参考:https://www.cnblogs.com/yangmingxianshen/p/8054094.html、《Redis设计与实现》

你可能感兴趣的:(redis)