vlambda博客
学习文章列表

话说:Redis五大对象

点击蓝字关注我们

话说:Redis五大对象

话说:Redis五大对象

不要失去信心,只要坚持不懈,就终会有成果的。——钱学森

引导语

对象来表示数据库中的键和值,每次当我们在Redis的数据库中新创建一个键值对时,我们至少会创建两个对象,一个对象用作键值对的键(键对象),另一个对象用作键值对的值(值对象)。

此篇主要介绍Redis中五大对象、对象对应的类型和编码。

1
对象的类型与编码

下图是对象对应的类型和编码,最后会说明如何查看不同键值对象的编码。

话说:Redis五大对象

2
字符串对象

字符串数据类型的相关命令用于管理 redis 字符串值。

字符串存储不同内容对应的编码

    int: 用来保存整数值。

    raw: 保存字符串(长度大于32字节)。

           调用两次内存分配函数(redisObject和sdshdr结构)

    embstr:保存字符串(长度小于32字节)。

                 调用一次内存分配函数(分配一块连续的空间)

double表示的浮点数,作为字符串值来保存(embstr/raw)

3
列表对象

列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部或者尾部。

一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

存储编码

ziplist:

满足条件:

    1)字符串元素长度都小于64字节

    2)元素数量小于512个

linkedlist:如上两个条件不满足使用此编码。

通过配置如下参数调整编码转换的条件:

list-max-ziplist-value 和 list-max-ziplist-entries

4
哈希对象

hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

每个 hash 可以存储 232 - 1 键值对(40多亿)。

存储编码

ziplist:

特点:

    1)保存了同一键值对的两个节点总是紧挨在一起,保存键的节点在前,保存值的节点在后

    2)先添加到哈希对象中的键值对会被放在压缩列表的表头方向,而后来添加到哈希对象中的键值对会被放在压缩列表的表尾方向

满足条件:

    1)保存的所有键值对的键和值的字符串长度都小于64字节

    2)键值对数量小于512个

hashtable:不满足如上两个条件使用此编码。

通过配置如下参数调整编码转换的条件:

hash-max-ziplist-value和hash-max-ziplist-entries

5

集合对象

Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

存储编码

intset:

满足条件:

    1)所有元素都是整数值

    2)元素数量不超过512个

hashtable:

    使用字典作为底层实现。字典的每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,而字典的值则全部被设置为NULL。

通过配置如下参数调整编码转换的条件:

set-max-intset-entries

6
有序集合对象

有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

存储编码
ziplist:

特点:

    1)每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,而第二个元素则保存元素的分值

    2)压缩列表内的集合元素按分值从小到大进行排序,分值较小的元素被放置在靠近表头的方向,而分值较大的元素则被放置在靠近表尾的方向。

满足条件:

    1)元素数量小于128个

    2)所有元素成员的长度都小于64字节

skiplist:

    包含字典和跳跃表结构。

    1)zset结构中的zsl跳跃表按分值从小到大保存了所有集合元素,每个跳跃表节点都保存了一个集合元素:跳跃表节点的object属性保存了元素的成员,而跳跃表节点的score属性则保存了元素的分值。通过这个跳跃表,程序可以对有序集合进行范围型操作,比如ZRANK、ZRANGE等命令就是基于跳跃表API来实现的

    2)zset结构中的dict字典为有序集合创建了一个从成员到分值的映射,字典中的每个键值对都保存了一个集合元素:字典的键保存了元素的成员,而字典的值则保存了元素的分值。通过这个字典,程序可以用O(1)复杂度查找给定成员的分值,ZSCORE命令就是根据这一特性实现的,而很多其他有序集合命令都在实现的内部用到了这一特性

    3)虽然zset结构同时使用跳跃表和字典来保存有序集合元素,但这两种数据结构都会通过指针来共享相同元素的成员和分值,所以同时使用跳跃表和字典来保存集合元素不会产生任何重复成员或者分值,也不会因此而浪费额外的内存。

通过配置如下参数调整编码转换的条件:

zset-max-ziplist-entries和zset-max-ziplist-value

7
简单命令

数据库键对应的值对象的类型:type key

数据库键的值对象的编码:object encoding key

定键的空转时长:OBJECT IDLETIME key

对象引用计数:object refcount key

8
类型检查与命令多态

对任何类型的键执行:

比如说DEL命令、EXPIRE命令、RENAME命令、TYPE命令、OBJECT命令等。

只能对特定类型的键执行:

比如说:

· SET、GET、APPEND、STRLEN等命令只能对字符串键执行;

· HDEL、HSET、HGET、HLEN等命令只能对哈希键执行;

· RPUSH、LPOP、LINSERT、LLEN等命令只能对列表键执行;

· SADD、SPOP、SINTER、SCARD等命令只能对集合键执行;

· ZADD、ZCARD、ZRANK、ZSCORE等命令只能对有序集合键执行;


更多内容请查看官网。

扫码关注更多精彩
话说:Redis五大对象
话说:Redis五大对象