Redis底层剖析——对象篇



一、对象

在这里插入图片描述

二、对象的类型

对与Redis数据库保存的键值对来说,键总是一个字符串对象,而值可以是下列类型。
在这里插入图片描述

1、字符串对象

字符串对象的编码可以是int、raw、embstr
如果一个字符串对象保存的是整数值,并且这个整数值可以用long类型来表示,那么字符串对象会将整数值保存再字符串对象结构的ptr属性里面(将void*转换为long)
在这里插入图片描述
如果字符串对象保存的是一个字符串组织,并且这个字符串值的长度大于32字节,那么字符串对象将使用一个简单动态字符串(sds)来保存这个字符串值,并将对象的编码设置为

raw
在这里插入图片描述
如果字符串对象保存的是一个字符串值,并且这个字符串值的长度小于等于32字节,那么字符串对象将使用embstr编码的方式来保存这个字符串值。

embstr
embstr编码:是专门用于保存短短字符串的一种优化编码方式,这种编码和raw编码一样,都使用了redisObject节后和sdshdr节后来表示字符串对象,但raw编码会调用两次内存分配函数来分别创建redisObject结构和sdshdr结构,而embstr编码则通过调用一次内存分配函数来分配一块连续的空间,空间一次包含redisObject和sdshdr两个结构。
在这里插入图片描述
在这里插入图片描述
int编码的字符串对象和embstr编码的字符串对象在条件满足的情况下,会被转换为raw编码的字符串对象

2、列表对象

列表对象的编码可以是ziplist或者linkedlist
Ziplist编码的列表对象使用压缩列表作为底层实现,每个压缩列表节点保存了一个列表元素。
在这里插入图片描述
Linkedlist编码的列表对象使用双端链表作为底层实现,每个双端链表节点都保存了一个字符串对象,而每个字符串对象都保存了一个列表元素。
在这里插入图片描述

3、哈希对象

哈希对象的编码可以是ziplist或者hashtable
ziplist编码的哈希对象使用压缩列表作为底层实现,每当有新的键值对要加入到哈希对象时,程序会将保存了键的压缩列表节点推入到压缩列表标为,然后再将保存了值的压缩列表节点推入到压缩列表表尾。
在这里插入图片描述

Hashtable编码的哈希对象使用字典作为底层实现
在这里插入图片描述
在这里插入图片描述

4、集合对象

集合对象的编码可以是intset或者hashtable
Intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面
在这里插入图片描述
在这里插入图片描述
另一方面,hashtable编码的集合对象使用字典作为其底层实现
在这里插入图片描述

4、有序集合对象

编码可以是ziplist或者skiplist
Ziplist
集合元素分值从小到大进行排序,分值小的元素被放置再靠近你表头的方向,而分值较大的元素则被放置再靠近表尾的方向
在这里插入图片描述
在这里插入图片描述

Skiplist编码的有序集合对象使用zset结构作为其底层实现,zset结构同时包含一个字典和一个跳跃表
在这里插入图片描述
在这里插入图片描述

三、总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值