剖析Redis常用数据类型对应的数据结构


Redis是一种key-value非关系型数据库

列表 list

这种数据类型是由两种方法实现的,一种是压缩列表ziplist , 另一种是双向循环链表.

当数据量小的时候,列表就可以使用压缩列表的方式实现,具体需要同时满足下面两个条件:

  • 列表保存的单个数据小于64个字节.
  • 列表数据个数少于512个.

关于压缩列表它并不是基础的数据结构,而是 Redis 自己设计的数据储存结构.它类似数据,是一片连续的内存空间来存储数据.有点类似数组,它跟数组不同的一点是,它允许数据的大小不一样.

剖析Redis常用数据类型对应的数据结构

为什么叫压缩列表? 最直接的反应就是节省内存,相当于数组的储存思路而言,我们知道数组要求每个元素大小相同,如果我们储存的是不同长度的字符串.那么就会使用最大长度的字符串大小作为元素的大小(例如假设是20个字节).当我们储存小于20个字节的时候,就会浪费部分空间.

剖析Redis常用数据类型对应的数据结构

压缩列表这种数据结构,一方面可以比较节省内存,另一方面还可以支持不同类型的数据存储.因为在一片连续的内存空间所以读取数据的效率也非常高.

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

字典 hash

字典这种数据类型用于储存一组数据对,每个数据对又包含又包含键值两部分.字典也是由两种方式实现的,一种是压缩列表,另外一种是散列表.

只有在数据量储存小的时候会使用压缩列表,同时需要满足下面两种条件:

  • 字典中保存的键和值大小都要小于64个字节.
  • 字典中键和值的个数要少于512个.

集合 set

集合用于储存一组不重复的数据,这种数据类型也有两种方法.一种是基于有序数组,另一种是基于散列表.

当储存的数据满足下面两种条件的时候,Redis 就使用 有序数组 来实现集合这种数据类型.

  • 储存的数据都是整数
  • 储存的元素个数不要超过512个.

有序集合 sortedset

有序集合用来储存一组数据,并且每个数据都会附带一个得分 score. 通过score的大小,我们将数据组织成跳表这样的数据结构.以快速按照得分或者区间获取数据.

当数据量小的时候会压缩列表来实现有序集合.需要同时满足下面两种情况.

  • 所有数据的大小都要小于64个字节.
  • 元素的个数要少于128个.

原文链接:https://www.zhanggaoyuan.com/article/1


文章作者: JellyTony
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 JellyTony !
评论
  目录