【学习笔记】Redis(2)-数据对象

Redis 通过前面介绍的主要数据结构,建立了字符串、列表、哈希、集合和有序集合这五种类型的对象。

对于 Redis 保存的键值对来说,键总是一个字符串对象,而值则可以是五种类型的对象之一,我们可以通过 TYPE key 命令来查看当前键保存的值的类型,通过 OBJECT ENCODING key 命令来查看一个键的值的编码类型。
Redis 中的每个对象都是由一个 redisObject 的结构来表示,我们主要介绍其中的三个属性:

(1)type:记录了这个对象的类型

(2)encoding:记录了对象底层实现所使用的数据结构类型

(3)ptr:指向对象底层结构的一个指针


1. 字符串对象

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

如果字符串对象保存的是一个整数值,并且这个整数值可以用 long 类型来表示,那么会使用 long 来保存这个值,并且编码类型为 int;如果字符串对象保存的是一个字符串值,并且长度大于 39 字节时,那么会使用 SDS 来保存这个值,并且编码类型为 raw;如果字符串对象保存的是一个字符串值,并且长度小于等于 39 字节时,那么会使用 embstr 编码来保存这个字符串值(embstr 编码是专门用于保存短字符串的一种优化编码方式,embstr 编码的字符串是一个只读的字符串,当对这个字符串执行任何修改命令时,程序会将这个字符串的编码转换为 raw 再执行,最终变成一个 raw 编码的字符串对象)。

另外,浮点数会以字符串的形式保存到字符串对象里,在执行运算时,会先转换回浮点数值,运算完成后又变回字符串保存到对象里。


2. 列表对象

Redis 列表是简单的字符串列表,按照插入顺序排序。列表里的元素是可以相同的。列表也可以当作一个双端队列来使用,它提供了一系列对队列操作的 API,具体可以查阅官方文档。

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

ziplist 编码的列表对象使用压缩列表作为底层实现,每个压缩列表节点保存了一个列表元素。如图:


linkedlist 编码的列表对象使用双端链表作为底层实现,每个双端链表节点都保存了一个字符串对象,而每个字符串对象都保存着一个列表元素。如图:



3. 哈希对象

哈希对象是键和值的映射,它的键是唯一的,即哈希对象里不能存在相同的键。

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

ziplist 编码的哈希对象使用压缩列表作为底层实现,每当有新的键值对加入时,先添加的键值对会被放在表头方向,后添加的键值对会被放到压缩列表的表尾,键值对的两个节点总是紧挨在一起,键在前,值在后,如下图:

hashtable 编码的哈希对象使用字典作为底层实现,哈希对象中的每个键值对都使用一个字典键值对来保存,字典的每个键和值都是一个字符串对象,如下图:



4. 集合对象

Redis 集合是一个无序的字符串合集,它有着不允许相同元素存在的优秀特性。向集合中多次添加同一元素,在集合中只会存在一个此元素。同时,Redis 为集合对象提供了求集合的交集、并集、差集等API,所以集合的功能是很强大的。例如,现在有多个集合,每个集合里都保存着每个人曾经看过的电影名称,如果要找出所有人都看过的电影,只需要求出所有集合的交集即可。

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

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



hashtable 编码的集合对象使用字典作为底层实现,字典的每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,而字典的值全部为 NULL,如下图:



5. 有序集合

Redis 的有序集合和集合类似,是不包含相同元素的合集。它们的差别是,每个有序集合的元素都关联着一个分值,集合中的元素按这个分值从低到高排列。Redis 为有序集合提供了通过分值和排名获取一个范围内元素的 API,这为我们带来了极大的便利。

有序集合的编码可以是 ziplist 或 skiplist。

ziplist 编码的有序集合对象使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的值,第二个节点保存元素的分值,压缩列表内的元素按分值从小到大进行排列,如下图所示:


skiplist 编码的有序集合对象使用 zset 结构作为底层实现,一个 zset 结构同时包含一个字典和一个跳表,如下图所示:


zsl 跳表按元素的分值从小到大保存,对有序集合执行范围型的操作(ZRANK、ZRANGE等),都是通过这个跳表的 API 来实现的。

dict 中保存的元素是无序,通过这个字典,程序可以快速的查找给定成员的分值。

虽然有序集合使用了跳表和字典来保存有序集合的元素,但是这两种数据结构都会通过指针来共享相同的元素,从而避免对内存空间的浪费。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值