Redis(二)value 的五种常见数据类型简述

目录

一、string(字符串)

 1、raw

2、int

3、embstr

二、hash(哈希表) 

 1、hashtable

2、ziplist

三、list(列表)

​编辑

1、linkedlist

2、ziplist

3、quicklist(redis 3.2后的列表内部编码方案)

四、set(集合)

1、hashtable

2、intset

五、zset(有序集合)

1、skiplist

2、ziplist

六、查询 value 内部编码格式


Redis 键值对结构中的 value 有五种最为常见的数据类型它们分别是:string(字符串)、list(列表)、hash(哈希)、set(集合)、zset(有序集合)

值得注意的是,这些只是 redis 对外的数据结构,其内部的底层实现方式会根据数据实时优化

PS:redis 只是确保对外用户使用的时候,可以按照提供的数据类型进行使用,时间复杂度也和提供的数据类型保持一致;但是底层在实现上述数据类型的时候,会在源码方面进行优化,即内部编码方式会有所不同。 (redis 会自动根据实际情况选择内部编码格式,用户无感知,我们只需要理解其思想即可)

一、string(字符串)

string 字符串类型内部有三种编码方式

 1、raw

raw 就是最基本的字符串,底层是 char 数组。

2、int

redis 一般也可以用来实现一些计数功能;因此当 value 是整数的时候,redis 底层就会把这个 value 优化成 int 来保存,占用空间小,也便于计算。

3、embstr

针对短字符串进行特殊优化

二、hash(哈希表) 

这里的 hash 类似于 C++ 中的 unordered_map

hash 类型内部有两种编码方式

 1、hashtable

hashtable 就是最基本的哈希表。

2、ziplist

ziplist 叫做压缩列表,其本质是个链表;在元素较少的时候,链表遍历时间复杂度也接近 O(1),这时候,redis 就会把 hash 类型的 value 底层优化成 ziplist,可以有效节省空间。

三、list(列表)

这里的 list 底层类似链表,类似C++中的 deque (双端队列,元素可以从首尾弹出)

list 类型内部有两种编码方式

1、linkedlist

linkedlist 就是最基本的链表,大部分情况下都是这个

2、ziplist

即压缩列表,在元素比较少的时候会优化成 ziplist,节省空间

3、quicklist(redis 3.2后的列表内部编码方案)

在 redis 3.2 版本之后,list 内部编码方案以 quicklist 代替了 linkedlist 和 ziplist,其同时拥有 linkedlist 和 ziplist 的特点:quicklist 整体结构是个链表,链表中的每个元素又都是 ziplist

(PS:只是 list 类型中的 ziplist 被 quicklist 所替代,但是其它数据类型底层的 ziplist 仍然使用)

四、set(集合)

set 中可以包含若干个元素,但是这些元素不能重复。

set  类型内部有两种编码方式

1、hashtable

 hashtable 就是最基本的哈希表

2、intset

当 set 类型的 value 中存储的都是整数时,redis 会把其底层优化成 intset

五、zset(有序集合)

zset 在存储元素的同时,还会存储权重,并把元素依照权重大小进行优先级排序

1、skiplist

skiplist 是跳表,其本质也是链表,但是其不同于普通的链表,其每个节点有多个指针域,根据这些指针域的灵活搭配,可以做到在跳表上查询元素的时间复杂度为 O(log n)

2、ziplist

压缩链表,和之前的一致,不再赘述。

六、查询 value 内部编码格式

object encoding key名

可以通过 object encoding,查看某个 key 对应的 value 的内部实际编码格式。

使用实例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值