一、对象
二、对象的类型
对与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结构同时包含一个字典和一个跳跃表