第8章 对象
8.1 对象的类型与编码
在Redis中存储对象时,键值对全部封装为RedisObject。
8.1.1 类型(type)
记录了对象的类型,Redis存储的Key为字符串对象,而Value可以是字符串对象、列表对象、哈希对象、集合对象、有序集合对象当中的一种。
8.1.2 编码和底层实现(encoding)
记录了一个对象使用的数据结构实现,同一种对象会使用不同的数据结构来实现,比如哈希对象可以用压缩列表与字典两种数据结构来实现。
8.2 字符串对象
1>若字符串对象存储的是一个long型的整数,那么会直接存储一个整数。
2>若存储的是39字节内的短字符串,则使用embstr码的字符串(短字符串的优化存储方式)。
3>若存储的是大于39字节的段字符串则使用SDS来保存。
8.2.1 编码的转换
当对long类型进行操作使其变成字符串类型时,会转换为SDS保存。
当对embstr进行任何修改命令都会使用SDS来保存。
8.2.2 字符串命令的实现
略,P68。
8.3 列表对象
1>当元素小于512个,且所有字符串长度小于64字节时,使用ZipList压缩列表来实现。
2>其他情况使用链表来存储。
8.3.1 编码转换
当元素超过个数限制或存入一个长字符串时会转换为链表存储。
8.3.2 列表命令实现
略,P71。
8.4 哈希对象
1>当键值对数量小于512个,每个键值对长度小于64字节时使用压缩列表存储。
2>其他情况使用字典存储。
(字典就相当于Java中的hashMap,原理及实现应该就不用再赘述了)
8.5 集合对象
1>当元素数量不超过512个,且都为整数时使用整数集合实现。
2>其他情况使用字典实现,关系相当于Java当中hashSet与hashMap的关系。
8.6 有序集合对象
1>元素小于128个(不同于之前的512个,因为需要做排序所以使用了更小的最大长度限制),成员长度小于64字节,使用压缩列表。
2>其他情况使用跳表+字典实现,其中字典的Key保存了分值,Value保存的存储数据。
8.7 类型检查与命令多态
有些命令可以对任意类型键执行,有些只能对特定类型健执行。
8.7.1 类型检查的实现
通过检查不同健对应值对象的Type实现
8.7.2 多态命令的实现
通过编码或类型的不同来执行不同的方法。
8.8 内存回收
通过引用计数法回收内存
8.9 对象共享
当两个健保存同一个整数对象(0-9999)时,会指向同一个初始化好的对象,然后让引用计数器+1。
8.10 对象的空转时长
Redis对象存在lru字段,某些内存回收的配置会在内存达到上线时回收掉lru较大的对象。