Redis第一篇——几种数据类型

标题上写Redis的几种数据类型,主要是与实现这几种数据类型的底层数据结构进行区分的。Redis支持的每种数据类型由其底层数据结构机型实现。

几种数据类型

1.string

String类型用于存储整数、字符串等,其底层是通过Redis在C语言基础上定义的SDS(Simple Dynamic String 简单动态字符串实现的),其在C字符串的基础上额外记录len和capacity字段,这样可以加速字符串的一些操作,同时让字符串有了预分配和懒回收的能力

预分配:当对字符串进行变更需要进行扩容时,如果字符串的大小小于1MB,则每次扩容后长度会进行加倍,如果字符串的大小大于1MB,则每次增加1MB的大小

懒回收:当字符串变小时,知识通过改变len和capacity来记录实际使用的长度,对于之前占用的占时不会立马进行回收

string类型实现内部依据保存的值类型、值长度会采用不同的内存分配策略,总体目标就是尽量的快和省内存。

2.list

list类型用于存储列表元素。列表在Redis底层通过压缩列表或双端链表来实现。

使用压缩列表:(1)元素个数小于512个 (2)存储的字符串元素长度小于64字节。 压缩列使用连续的空间,每个压缩列表节点存储数据和前一个节点的长度,压缩列表头部会记录整个列表占用的字节数、记录列表表尾距离起始地址的字节数和列表元素的个数(ps:使用压缩列表会有连锁更新的问题,主要是由于某一节点数据变更导致节点空间占用大小变化导致的)

使用链表:每个节点对应链表中的一个节点,同时包含pre和next指针

使用quicklist:将链表和ziplist结合起来,每个链表下面挂在ziplist,每个ziplist存储超过8kb就新开一个ziplist

3.hash

hash用于存储key-value对类型的数据。底层使用压缩列表或哈希表实现

使用压缩列表:(1)所有键值对的字符串长度都小于64字节(2)保存的键值对数量小于512个。 压缩列表和list类似,只是key和value作为相邻的元素进行存储

使用哈希表:哈希表和Java总hashMap实现类似,只不过Redis使用了两个hash表h0和h1,主要用于扩容和缩容使用。

4.set

set用于存储不重复的集合元素。依据存储的元素的值类型,底层使用整数集合和哈希表实现

使用整数集合:(1)当存储的元素全为整数时(2)存储的元素个数少于512个。会用一个数组来存储元素,其中会涉及到当元素长度较大时的升级(比如原来用int8存储元素,但来了一个只能用int16才能存储,就需要升级为int16的数组),不支持降级(及时大元素被删了)

5.zset

zset用于存储带分值的元素集合。底层使用压缩列表或跳跃表进行存储。

使用压缩列表:(1)有序集合元素个数少于128个(2)所有元素的长度都小于64字节

使用跳跃表:跳跃表是一种在大部分情况下,查找性能和平衡树媲美的数据结构

几种数据结构

1.SDS

2.压缩列表

3.链表

4.哈希表

5.跳跃表

6.整数集合

7.快表:实际上市ziplist和链表的结合,每个链表节点下面挂一个ziplist

 

你可能感兴趣的:(Redis)