Redis是一种key-value非关系型数据库
列表 list
这种数据类型是由两种方法实现的,一种是压缩列表ziplist
, 另一种是双向循环链表
.
当数据量小的时候,列表就可以使用压缩列表
的方式实现,具体需要同时满足下面两个条件:
- 列表保存的单个数据小于64个字节.
- 列表数据个数少于512个.
关于压缩列表它并不是基础的数据结构,而是 Redis 自己设计的数据储存结构.它类似数据,是一片连续的内存空间来存储数据.有点类似数组,它跟数组不同的一点是,它允许数据的大小不一样.
为什么叫压缩列表? 最直接的反应就是节省内存,相当于数组的储存思路而言,我们知道数组要求每个元素大小相同,如果我们储存的是不同长度的字符串.那么就会使用最大长度的字符串大小作为元素的大小(例如假设是20个字节).当我们储存小于20个字节的时候,就会浪费部分空间.
压缩列表这种数据结构,一方面可以比较节省内存,另一方面还可以支持不同类型的数据存储.因为在一片连续的内存空间所以读取数据的效率也非常高.
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
字典 hash
字典这种数据类型用于储存一组数据对,每个数据对又包含又包含键值两部分.字典也是由两种方式实现的,一种是压缩列表
,另外一种是散列表
.
只有在数据量储存小的时候会使用压缩列表,同时需要满足下面两种条件:
- 字典中保存的键和值大小都要小于64个字节.
- 字典中键和值的个数要少于512个.
集合 set
集合用于储存一组不重复的数据,这种数据类型也有两种方法.一种是基于有序数组
,另一种是基于散列表
.
当储存的数据满足下面两种条件的时候,Redis 就使用 有序数组
来实现集合这种数据类型.
- 储存的数据都是整数
- 储存的元素个数不要超过512个.
有序集合 sortedset
有序集合用来储存一组数据,并且每个数据都会附带一个得分 score
. 通过score
的大小,我们将数据组织成跳表
这样的数据结构.以快速按照得分或者区间获取数据.
当数据量小的时候会压缩列表
来实现有序集合.需要同时满足下面两种情况.
- 所有数据的大小都要小于64个字节.
- 元素的个数要少于128个.