Redis--数据结构--内部结构
Redis--数据结构--内部结构
Redis的数据结构和内部结构
redis有5种数据结构,这5种数据结构在内部存储的时候,是不同的数据结构实现:
redis查看数据结构的内部结构
redis中,查询key内部结构的命令是Object
不过,因为中文社区维护有一定的滞后性,所以建议中文,英文结合阅读。
从官网可以得到这个命令:OBJECT ENCODING key
官网也给出了数据结构和内部结构的对应关系:
String – int
数字
如果String中存储的是可以转为64位无符号整形的数字,那么就会以这种方式存储。
如果数字太大,64位放不下呢?
这个过程是可逆的
String – embstr
短字符串
在String–int中,我们了解到,如果字符串可以转为数字,而且,长度小于等于64位,使用int存储,如果可以转为数字,而且大于64位使用raw存储。那么如果是不可转为数字,小于等于64位呢
如果超出64位,会升级为raw
如果小于等于64位会降级为embstr
String – raw
长字符串
字符串长度大于64位时,使用raw存储,如果小于等于64位,如果可以转为数字,那么使用int,如果不可以转为数字,使用embstr.
List – quickList
快速列表
在最新版本的redis中,list全部使用quickList。
List – zipList
压缩列表
如果list的元素length小于hash-max-ziplist-entries配置(默认512)个,且list内每一个元素的value小于hash-max-ziplist-value配置(默认64字节),那么list就会使用zipList存储。
而且redis的官网上也给出的是这样的:
不过,在最新的redis版本中,List却不符合官网描述。
List – linkedList
链表
一般情况下使用linkedList存储数据。
不过,在最新的redis版本中,List却不符合官网描述。
Hash – zipList
压缩列表
当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个),同时所有值都小于hash-max-ziplist-value配置(默认64个字节)时,Redis会使用ziplist作为哈希的内部实现ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
结构升级:zipList升级为hashTable
无法逆转
Hash --hashTable
哈希表
当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现。因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)。
Set – intSet
数字集合
如果集合中的元素能转为数字,且数量较少时(set-max-intset-entries配置(默认512个)),使用intSet,intSet占用空间小。
如果元素数量很少,但是存在不能转为数字呢?转为hashTable
而且这个升级过程不可逆
Set – hashTable
哈希表
如果Set中的元素比较多(set-max-intset-entries配置(默认512个)),而且存在无法转为数字的元素的时候,就会使用hashTable.
Sorted Set – zipList
压缩表
当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个)同时每个元素的值小于zset-max-ziplist-value配置(默认64个字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存使用。
结构升级:zipList => skipList
升级可逆
Sorted Set – skipList
跳表
当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时zip的读写效率会下降。