redis--内部数据结构

[TOC]

Redis的数据结构和内部结构

redis有5种数据结构,这5种数据结构在内部存储的时候,是不同的数据结构实现:

23 1graph TB2A[redis] --- B[String]3A --- C[List]4A --- D[Hash]5A --- E[Set]6A --- F[Sorted Set]78B --- B1[raw]9B --- B.png

redis查看数据结构的内部结构

redis中,查询key内部结构的命令是Object

官方介绍

中文社区介绍

不过,因为中文社区维护有一定的滞后性,所以建议中文,英文结合阅读。

image-20200718170900751

从官网可以得到这个命令:OBJECT ENCODING key

官网也给出了数据结构和内部结构的对应关系:

image-20200718171228418

String -- int

==数字==

如果String中存储的是可以转为64位无符号整形的数字,那么就会以这种方式存储。

image-20200718171619043

如果数字太大,64位放不下呢?

image-20200718171737557

这个过程是可逆的

image-20200718172135221

String -- embstr

==短字符串==

在String--int中,我们了解到,如果字符串可以转为数字,而且,长度小于等于64位,使用int存储,如果可以转为数字,而且大于64位使用raw存储。那么如果是不可转为数字,小于等于64位呢

image-20200718172416951

如果超出64位,会升级为raw

image-20200718172449313

如果小于等于64位会降级为embstr

image-20200718172532047

String -- raw

==长字符串==

字符串长度大于64位时,使用raw存储,如果小于等于64位,如果可以转为数字,那么使用int,如果不可以转为数字,使用embstr.

List -- quickList

==快速列表==

在最新版本的redis中,list全部使用quickList。

image-20200718174109267

List -- zipList

==压缩列表==

如果list的元素length小于hash-max-ziplist-entries配置(默认512)个,且list内每一个元素的value小于hash-max-ziplist-value配置(默认64字节),那么list就会使用zipList存储。

而且redis的官网上也给出的是这样的:

image-20200718174203862

==不过,在最新的redis版本中,List却不符合官网描述。==

List -- linkedList

==链表==

一般情况下使用linkedList存储数据。

==不过,在最新的redis版本中,List却不符合官网描述。==

Hash -- zipList

==压缩列表==

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

image-20200718182217719

结构升级:zipList升级为hashTable

image-20200718182435303

==无法逆转==

image-20200718182648818

Hash --hashTable

==哈希表==

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

Set -- intSet

==数字集合==

如果集合中的元素能转为数字,且数量较少时(set-max-intset-entries配置(默认512个)),使用intSet,intSet占用空间小。

image-20200718174721082

如果元素数量很少,但是存在不能转为数字呢?==转为hashTable==

image-20200718174828352

而且这个升级过程不可逆

image-20200718174934558

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可以有效减少内存使用。

image-20200718182937242

结构升级:zipList => skipList

image-20200718183033333

升级可逆

image-20200718183257582

Sorted Set -- skipList

==跳表==

当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时zip的读写效率会下降。

image-20200718183434659

你可能感兴趣的:(redis--内部数据结构)