文章

Redis--数据结构--内部结构

本文深入解析Redis中的五种数据结构及其内部实现方式,包括String、List、Hash、Set和SortedSet,探讨不同条件下数据结构的选择及转换机制。

Redis--数据结构--内部结构

文章信息

  • 原文链接:https://jiayq.blog.csdn.net/article/details/107433345
  • 发布时间:2020-07-18 18:39:39
  • 阅读量:427
  • 分类:Redis专栏收录该内容, 订阅专栏
  • 标签:#Redis内部数据结构, #如何查看Redis内部数据结构, #Redis内部实现, #Redis数据结构, #Redis的数据结构和命令

摘要

文章浏览阅读427次。本文深入解析Redis中的五种数据结构及其内部实现方式,包括String、List、Hash、Set和SortedSet,探讨不同条件下数据结构的选择及转换机制。


Redis–数据结构–内部结构

  • Redis的数据结构和内部结构
  • redis查看数据结构的内部结构
  • String – int
  • String – embstr
  • String – raw
  • List – quickList
  • List – zipList
  • List – linkedList
  • Hash – zipList
  • Hash –hashTable
  • Set – intSet
  • Set – hashTable
  • Sorted Set – zipList
  • Sorted Set – skipList

Redis的数据结构和内部结构

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

redis

String

List

Hash

Set

Sorted Set

raw

embstr

int

zipList

linkedList

quickListy

hashTable

intSet

skipList

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

本文由作者按照 CC BY 4.0 进行授权