Redis第一篇——几种数据类型
Posted 搬砖小松鼠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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第一篇——几种数据类型的主要内容,如果未能解决你的问题,请参考以下文章
测开之数据类型・第一篇《Python数据类型元祖和列表的性能分析》