redis的数据类型都是通过多种数据结构来实现,主要是出于时间和空间的考虑,当数据量小的时候通过数组下标访问最快,占用内存最小【压缩列表是数组的变种,允许存储的数据大小不同】
因为数组需要占用连续的内存空间,所以当数据量大的时候,就需要使用链表,同时为了保证速度又需要和数组结合,也就有了散列表。
1、字符串
2、列表(list):支持存储一组数据,这种数据类型对应两种实现方法,一种是压缩列表,另一种是双向循环链表
压缩列表:数据集比较少的时候,采用压缩列表
redis自己设计的一种存储结构,类似数组,通过一片连续的内存空间来存储数据,但它允许存储的数据大小不同
条件:
- 列表中保存的单个数据小于64个字节
- 列表中数据个数少于512个
优点:
- 节省内存
- 支持不同类型数据的存储
- 数据存储在一片连续的内存空间,通过键来获取值为列表类型的数据,读取效率也非常高。
双向循环链表:数据量比较大时,列表使用双向循环链表实现
3、字典(hash):存储一组数据对,每个数据对又包含键值两部分。
压缩列表:数据集比较少的时候,采用压缩列表
条件:
- 列表中保存的键和值的大小都小于64个字节
- 列表中键值对个数少于512个
散列表:数据量比较大,不满足上述条件,使用散列表实现。
redis使用MurmurHash2这种运行速度快,随机性好的哈希算法作为哈希函数,对于哈希冲突,redis使用链表法来解决。
redis支持散列表的动态扩容、缩绒。
4、集合(set):一种是基于有序数组,一种是基于散列表。
有序数组:
条件:
- 存储的数据都是整数
- 存储的数据元素个数不超过512个
散列表:
5、有序集合(sort set):
用来存储一组数据,并且每个数据会附带一个得分。通过得分的大小,我们将数据组织成跳表这样的数据结构,以支持快速地按照得分值、得分区间获取数据。
压缩列表:数据集比较少的时候,采用压缩列表
条件:
- 保存的数据小于64个字节
- 元素个数小于128个
跳表: