Redis8-对象

Redis基于数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象。

一、对象的类型与编码

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

Redis中的每个对象都由一个redisObject结构表示,该结构中和保存数据有关的三个属性分别是type属性、encoding属性和ptr属性:
在这里插入图片描述

1.1 类型

对象的type属性记录了对象的类型,这个属性可以是下表列出的常量的其中一个:
在这里插入图片描述
对于Redis数据库保存的键值对来说,键总是一个字符串对象,而值则可以是字符串对象、列表对象、哈希对象、集合对象或有序集合对象的其中一种。因此:

  • 当我们称呼一个数据库键为“字符串键”时,我们指的是“这个数据库键所对应的值为字符串对象”
  • 当我们称呼一个键为“列表键”时,我们指的是“这个数据库键所对应的值为列表对象”

1.2 编码和底层实现

对象的ptr指针指向对象的底层实现数据结构,而这些数据结构由对象的encoding属性决定。

encoding属性记录了对象所使用的编码,也即是说这个对象使用了什么数据结构作为对象的底层实现,这个属性的值可以是下表列出的常量中的其中一个:
在这里插入图片描述
每种类型的对象都至少使用了两种不同的编码,下标列出了每种类型的对象可以使用的编码:
在这里插入图片描述
使用OBJECT ENCODING命令可以查看一个数据库键的值对象的编码:
在这里插入图片描述

下表列出了不同编码的对象所对应的OBJECT ENCODING命令输出:
在这里插入图片描述
在这里插入图片描述

二、字符串对象

字符串对象的编码可以是int、raw或embstr

三、列表对象

列表对象的编码可以是ziplist或者linkedlist。

ziplist编码的列表对象使用压缩列表作为底层实现,每个压缩列表结点(entry)保存了一个列表元素。举个例子,如果我们执行以下RPUSH命令,那么服务器将创建一个列表对象作为numbers键的值:
在这里插入图片描述
如果numbers键的值对象使用的是ziplist编码,这个值对象将会是下图所示:
在这里插入图片描述
另一方面,linkedlist编码的列表对象使用双端链表作为底层实现,每个双端列表结点(node)都保存了一个字符串对象,而每个字符串对象都保存了一个列表元素:

以上面为例,如果使用linkedlist编码,那么numbers键的值对象将会是下图所示:
在这里插入图片描述

四、哈希对象

哈希对象的编码可以是ziplist或者hashtable

ziplist编码的哈希对象使用压缩列表做为底层实现,每当有新的键值对要加入哈希对象时,程序会先将保存了键的压缩列表结点推入到压缩列表表尾,然后再将保存了值的压缩列表结点推入到压缩列表表尾,因此:

  • 保存了同一键值对的两个结点总是紧挨在一起,保存键的节点在前,保存了值的节点在后
  • 先添加到哈希对象中的键值对会被放在压缩列表的表头方向,而后来添加到哈希对象中的键值对会被放在压缩列表的表尾方向。

举个例子,如果我们执行以下HSET命令,那么服务器将创建一个列表对象作为profile键的值:
在这里插入图片描述
如果profile键的值对象使用的是ziplist编码,那么这个值对象将会是下图的样子:
在这里插入图片描述
其中对象所使用的压缩列表如下图所示:
在这里插入图片描述
另一方面,hashtable编码的哈希对象使用字典作为底层实现,哈希对象中的每个键值对都使用一个字典键值对来保存:

  • 字典的每个键都是一个字符串对象,对象中保存了键值对的键
  • 字典的每个值都是一个字符串对象,对象中保存了键值对的值

还是以上面的例子,如果上面profile键创建的是hashtable编码的哈希对象,那么这个哈希对象会是下面所示的样子:
在这里插入图片描述

五、集合对象

集合对象的编码可以是intset或者hashtable

intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。

以举个例子,以下代码将创建一个如下图所示的编码集合对象:
在这里插入图片描述
在这里插入图片描述
而另一方面,hashtable编码的集合对象使用字典作为底层实现,字典的每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,而字典的值则全部被设置为NULL。

同样举个例子,以下代码将创建如下图所示的hashtable编码集合对象:
在这里插入图片描述
在这里插入图片描述

六、有序集合对象

七、类型检查与命令多态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值