- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
?
?
《Redis 设计与实现》读书笔记-Redis 对象
?
?
一、Redis 对象
1.1 Redis 对象简介
Redis 使用对象来表示数据库中键和值,当我们在数据库中存储一个键值对时,至少会创建两个对象,一个对象用于存储键值对的键,另一个对象用于存储键值对的值。
Redis 中的每一个对象都由一个 redisObject 结构表示,该结构有三个属性和保存的数据有关,分别是 type 属性、encoding 属性和 ptr 属性。
typedef struct redisObject {
// 类型
unsigned type:4;
// 编码
unsigned encoding:4;
// 指向底层数据实现数据结构的指针
void *ptr;
} robj;
1.2 对象类型
redisObject 对象的 type 属性记录了对象的类型,Redis 中的键总是一个字符串对象,值对象可以是字符串对象、哈希对象、集合对象等。
我们可以通过使用 TYPE key 命令查看数据库键对应的值对象的类型。
1.3 编码与底层实现
encoding 属性记录了对象所使用的编码,也就是这个对象底层实现的数据结构。关于编码可以使用 OBJECT ENCODING key 命令查看。
二、五种数据类型对象与编码
2.1 字符串对象
要注意的是 long、double 浮点数在 Redis 中也是作为字符串值来保存的。
(1)字符串对象编码
字符串对象的编码有 int 、 raw 或者 embstr 三种。
int:保存的是整数值
raw:保存的是字符串,并且字符串的长度小于等于 39 个字节
embstr:保存的是字符串,并且字符串的长度大于等于 39 个字节
embstr 编码的好处:
embstr 编码将创建字符串对象所需的内存分配次数从 raw 编码的两次降低为一次。
释放 embstr 编码的字符串对象只需要调用一次内存释放函数, 而释放 raw 编码的字符串对象需要调用两次内存释放函数。
因为 embstr 编码的字符串对象的所有数据都保存在一块连续的内存里面,所以这种编码的字符串对象比起 raw 编码的字符串对象能够更好地利用缓存带来的优势。
(2)编码转换
int 编码的字符串对象和 embstr 编码的字符串对象在一定条件下, 会被转换为 raw 编码的字符串对象,如下。
int 编码的字符串对象通过某些操作,保存的不再是单纯的整数值
对 embstr 编码的字符串对象执行任何修改命令时, 程序会先将对象的编码从 embstr 转换成 raw , 然后再执行修改命令
下面是一个例子,供参考:
127.0.0.1:6379 SET num-str 100
OK
127.0.0.1:6379 OBJECT ENCODING num-str
int
# 追加元素内容
127.0.0.1:6379 APPEND num-str hei~
(integer) 7
127.0.0.1:6379 OBJECT ENCODING num-str
raw
2.2 列表对象
(1)列表对象编码
Redis 3.2 以前的版本中列表的的编码类型有 ziplist 或 linkedlist。
ziplist 编码的列表对象使用压缩列表作为底层实现, 每个压缩列表节点(entry)保存了一个列表元素。
linkedlist 编码的列表对象使用双端链表作为底层实现, 每个双端链表节点(node)都保存了一个字符串对象, 而每个字符串对象都保存了一个列表元素。
在 Redis 3.2 以上的版本中列表对象的编码替换为 quicklist,它的底层实现是一个双向链表,而且是一个ziplist 数据结构的双向链表。关于这种数据结构的详细信息就不介绍了,以后有机会接触到 Redis 的源码后再单独拿出来总结。
例子如下(基于 3.2.× 版本):
127.0.0.1:6379 RPUSH students zs ls ww
(integer) 3
127.0.0.1:6379 OBJECT ENCODING students
quicklist
2.3 哈希对象
(1)哈希对象编码
哈希对象的编码是 ziplist 或 hashtable。
ziplist 编码的哈希对象使用压缩列表作为底层实现,每当有新的键值对要加入到哈希对象时,程序会先将保存了键的压缩列表节点推入到压缩列表表尾,然后再将保存了值的压缩列表节点推入到压缩列表表尾。因此保存了同一键值对的两个节点总是紧挨在一起, 保存键的节点在前, 保存值的节点在后。
hashtable 编码的哈希对象使用字典作为底层实现,哈希对象中的每个键值
您可能关注的文档
最近下载
- 有趣的心理学课件.ppt VIP
- LabVIEW软件在锂电池故障模拟检测系统的设计与开发.docx VIP
- 木结构建筑防火性能分析.pptx VIP
- 第8章 剥蚀厚度与埋藏史和埋藏史恢复方法.ppt
- 05J909:工程做法国标 行业图集.pdf VIP
- 浙江省杭州市临平区2024−2025学年七年级上学期分班考 数学试题(7月份)(含解析).docx VIP
- 2024-2025学年江苏省苏州市星海实验中学高一(上)期中考试物理试卷(含答案).docx VIP
- 右心衰竭患者麻醉指南.pptx
- 销售人员必备山东省滨州市惠民县医疗机构分布明细.pdf VIP
- 销售人员必备山东省滨州市阳信县医疗机构分布明细.pdf VIP
文档评论(0)