参考资料
参考资料
参考资料
抽象出来的的对象
Redis没有直接使用前面的几种数据结构来创建键值对数据库,而是对于这些数据结构来创建了一个对象系统。这个系统包含了字符串对象
,列表对象
,哈希对象
,集合对象
,有序集合对象
使用对象的好处
-
在指向命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令
-
根据不同的使用场景,对对象设置多种不同的数据结构实现
-
Redis对象系统还实现了
基于引用计数计数
的内存回收机制,当程序不再使用某个对象的时候,这个对象所占的内存就会被自动释放 -
带有访问时间记录信息。在服务器启用了maxmemory功能的情况下,空转时间较长的哪些键可能会优先被服务器删除
对象的类型和编码
数据底层存储结构
底层存储
Redis使用对象来表示数据库中的键和值,每次当我们在Redis的数据库中新创建一个键值对时,我们至少会创建两个对象一个,一个对象用作键值对的键(键对象
),另一个对象用作键值对的值(值对象
)
RedisObject对象
Redis中的每个对象都由一个
redisObject
结构表示,该结构中和保存数据有关的三个属性分别是type
属性。encoding
属性和ptr
属性
字符串对象
字符串对象的编码可以是
int
,raw
和embstr
编码
- 若字符串对象保存的是整数值,并且这个整数值可以用
long
类型来表示,那么字符串会将整数值保存成int
编码 - 若
字符串
对象保存是一个字符串值,并且这个字符串值大于等于32字节,那么字符传对象将使用SDS
- 若
字符串
对象保存是一个字符串值,并且这个字符串值小于等于32字节,那么字符传对象将使用embstr
=编码,啊
long double类型表示的浮点数在Redis中也是作为字符串值来保存的
编码的转换
列表对象
列表对象的编码可以是
压缩列表
和链表
编码
hash对象
hash对象的编码可以是
压缩列表
和字典
集合对象
集合对象的编码可以是
整数集
和字典
有序集合对象
集合对象的编码可以是
压缩队列
和跳表