首页 > 其他 > 详细

redis进阶(三)redis对象的实现

时间:2020-12-03 22:00:14      阅读:42      评论:0      收藏:0      [点我收藏+]

五种对象对应的 RedisObject

字符串对象(string)

字符串对象的 encoding 有三种,分别是:int、raw、embstr。

  1. 如果一个字符串对象保存的是整数值,并且这个整数值可以用 long 类型标识,那么字符串对象会讲整数值保存在 ptr 属性中,并将 encoding 设置为 int。
    假设有如下命令:set number 10086。那么 number 键对象的示意图如下(出自《Redis设计与实现第二版》第八章:对象):
    技术分享图片

  2. 如果字符串对象保存的是一个字符串值,并且这个字符串的长度大于 32 字节,那么字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值,并将对象的编码设置为 raw。
    使用 raw 存储字符串的示意图如下(出自《Redis设计与实现第二版》第八章:对象):
    技术分享图片

  3. 如果字符串对象保存的是一个字符串值,并且这个字符串的长度小于等于 32 字节,那么字符串对象将使用 embstr 编码的方式来保存这个字符串。
    使用 embstr 存储字符串的示意图如下(出自《Redis设计与实现第二版》第八章:对象):
    技术分享图片

既然有了 raw 的编码方式,为什么还会有 embstr 的编码方式呢?
因为 embstr 的编码方式有一些优点,如下:

  • embstr 编码将创建字符串对象所需的内存分配次数从 raw 编码的两次降低为一次。
  • 释放 embstr 编码的字符串对象只需要调用一次内存释放函数,而释放 raw 编码的字符串对象需要调用两次内存释放函数。
  • 因为 embstr 编码的字符串对象的所有数据都保存在一块连续的内存里面,所以这种编码的字符串对象比起 raw ,编码的字符串对象能够更好地利用缓存带来的优势。

哈希对象(hash)

哈希对象的编码有两种,分别是:ziplist、hashtable。
当哈希对象保存的键值对数量小于 512,并且所有键值对的长度都小于 64 字节时,使用压缩列表存储;否则使用 hashtable 存储。

哈希对象的压缩列表对应的示意图如下(出自《Redis设计与实现第二版》第八章:对象):

技术分享图片

哈希对象的 hashtable 对应的示意图如下(出自《Redis设计与实现第二版》第八章:对象):

技术分享图片

列表对象(list)

列表对象的编码有两种,分别是:ziplist、linkedlist。

ziplist(压缩列表)主要是为节省内存而设计的内存结构,它的优点就是节省内存,但缺点就是比其他结构要消耗更多的时间,所以 Redis 在数据量小的时候使用压缩列表存储。

当列表的长度小于 512,并且所有元素的长度都小于 64 字节时,使用压缩列表存储;否则使用 linkedlist 存储。

列表对象的压缩列表对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):

技术分享图片

列表对象的链表对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):

技术分享图片

集合对象(set)

集合对象的编码有两种,分别是:intset、hashtable。

intset(整数集合)主要是为节省内存而设计的内存结构,它的优点就是节省内存,但缺点就是比其他结构要消耗更多的时间,所以 Redis 在数据量小的时候使用整数集合存储。

当集合的长度小于 512,并且所有元素都是整数时,使用整数集合存储;否则使用 hashtable 存储。

集合对象的 intset 对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):

技术分享图片

集合对象的 hashtable 对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):

技术分享图片

有序集合对象(sort set)

有序集合对象的编码有两种,分别是:ziplist、skiplist。

当有序集合的长度小于 128,并且所有元素的长度都小于 64 字节时,使用压缩列表存储;否则使用 skiplist 存储。

有序集合对象的 ziplist 对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):

技术分享图片

有序集合对象的 skiplist 对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):

技术分享图片

转自:https://www.cnblogs.com/wind-snow/p/11172832.html

redis进阶(三)redis对象的实现

原文:https://www.cnblogs.com/ttaylor/p/14082776.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!