redis进阶(三)redis对象的实现
五种对象对应的 RedisObject
字符串对象(string)
字符串对象的 encoding 有三种,分别是:int、raw、embstr。
-
如果一个字符串对象保存的是整数值,并且这个整数值可以用 long 类型标识,那么字符串对象会讲整数值保存在 ptr 属性中,并将 encoding 设置为 int。
假设有如下命令:set number 10086。那么 number 键对象的示意图如下(出自《Redis设计与实现第二版》第八章:对象): -
如果字符串对象保存的是一个字符串值,并且这个字符串的长度大于 32 字节,那么字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值,并将对象的编码设置为 raw。
使用 raw 存储字符串的示意图如下(出自《Redis设计与实现第二版》第八章:对象): -
如果字符串对象保存的是一个字符串值,并且这个字符串的长度小于等于 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
posted on 2020-12-03 20:50 1450811640 阅读(82) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~