redis 的设计与实现(三)——对象

1. 前言:

在这里插入图片描述

在第一章节我们了解到了,redis底层所涉及的数据结构,但是这并非是离我们最近的一层,在此之上,redis实现了一层对象与我们交互。我们在本篇内容中将了解到:

  • 对象对应的实现
  • redis一些常用特性的实现

2.对象:

2.1:对象的基本结构:

redis 在通常建立存储一个内容的同时会建立两个对象,一个为key(通常为字符串),一个为value(可以为任何类型的对象)。
在这里插入图片描述

  1. type 指的是对象的类型,redis中有五种类型。
类型常量对象名称
REDIS_STRING字符串对象
REDIS_LIST列表对象
REDIS_HASH哈希对象
REDIS_SET集合对象
REDIS_ZSET有序集合对象
  1. encoding指的是底层数据结构
编码常量数据结构
REDIS_ENCODING_INTlong类型整数
REDIS_ENCODING_EMSTRembstr编码的简单动态字符串
REDIS_ENCODING_RAR简单动态字符串
REDIS_ENCODING_HT字典
REDIS_ENCODING_INKEDLIST双端链表
REDIS_ENCODING_ZIPLIST压缩列表
REDIS_ENCODING_INTSET整数集合
REDIS_ENCODING_SKIPLIST跳跃表和字典

当然,type和encoding不能随意组合。可组合列表如下。

类型编码对象
REDIS_STRINGREDIS_ENCODING_INT整数实现的字符串对象
REDIS_STRINGREDIS_ENCODING_EMSTRembstr编码的简单动态字符串对象
REDIS_STRINGREDIS_ENCODING_RAR简单动态字符串组成的动态字符串对象
REDIS_LISTREDIS_ENCODING_ZIPLIST压缩列表实现的列表对象
REDIS_LISREDIS_ENCODINGLINKEDLIST双端链表实现的列表对象
REDIS_HASHREDIS_ENCODINGLINKEDLIST压缩列表实现的哈希对象
REDIS_HASHREDIS_ENDODING_HT字典实现的哈希对象
REDIS_SETREDIS_ENCODING_INSET使用整数集合实现的集合对象
REDIS_SETREDIS_ENCODING_SET使用字典实现的集合对象
REDIS_ZSETREDIS_ENCODING_ZIPLIST使用压缩列表实现的有序集合对象
REDIS_ZSETREDIS_ENCODING_SKIPLIST使用跳跃表和字典实现的有序集合对象
  1. ptr 指向底层实现的数据结构。

2.2:字符串对象:

字符串对象的编码可以是int,raw和embstr。

  1. embstr: 小于32位,用于存储短的字符串,并且不提供变更的方法,如果存在修改总会变成raw格式。
    a4a2.png)

  2. long:用于存储整数,当在long范围内的整数通常用long格式编码;long追加字符串总会变为 raw 编码。

  3. raw:用于存储长的字符串
    在这里插入图片描述

在这里插入图片描述

  • raw 创建释放对象对内存的操作为两次,与sdshdr内存不连续
  • embstr 创建释放对象对内存操作的次数为1次,内存连续
  • 在这里插入图片描述

2.3:列表对象:

列表对象的底层可以是压缩列表和链表

  • 压缩列表的列表的数据结构在这里插入图片描述
  • 双端链表的列表的数据结构
    -

编码使用的条件

  1. 如果列表对象保存的所有字符串的长度都小于64字节且元素数量小于512个,则使用压缩列表。
  2. 反之,则使用双端链表。
    在这里插入图片描述

2.4:哈希对象:

哈希对象的底层实现可以是压缩列表和字典。

  1. 当使用压缩列表
    在这里插入图片描述
  • 使用压缩列表作为底层数据结构的时候,元素从尾部添加。
  • 在添加key-value时,压缩列表会把key先放入尾部,然后吧value放入尾部。在这里插入图片描述
  1. 当使用字典
    在这里插入图片描述

编码使用的条件

  • 如果列表对象保存的所有字符串的长度都小于64字节且元素数量小于512个,则使用压缩列表。
  • 反之,则使用字典。
  • 在这里插入图片描述

2.5:set集合对象:

集合对象可以使用 inset 和 ht 字典实现,
在这里插入图片描述
编码使用的条件

  • 如果列表对象保存的所有字符串的长度都小于64字节且元素数量小于512个,则使用intset。
  • 反之,则使用字典。
    在这里插入图片描述

2.6. 有序集合对象

有序集合对象的底层可以是压缩列表和跳表。

  1. 当使用压缩列表
  • 存储思路和哈希对象类似,依旧是 value score 并列放置,不过内部是有序的。小元素在前,大元素在后。
  • 插入的时候一般使用插入排序,如果插入的元素最大,则时间复杂度最小,因为不需要挪动元素。
    在这里插入图片描述
    在这里插入图片描述
  1. 使用跳表+字典
    在这里插入图片描述

有序集合在使用这两种组合结构是为链各个目标。

  • 能O(1)查询时间分值
  • 能通过分值快速筛序成员
    编码使用的条件
  • 如果列表对象保存的所有字符串的长度都小于64字节且元素数量小于128个,则使用intset。
  • 反之,则使用字典。
  • 在这里插入图片描述
  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只会写bug的靓仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值