- type
- encoding
一.字符串对象
字符串对象如果保存的是整数值,编码为int。
字符串对象如果保存的是长度大于32字节的字符串,编码为raw。
字符串对象如果保存的是长度小于等于32字节的字符串,编码为embstr。
embstr调用一次内存分配函数分配一块连续的空间存放redisObject和sdshdr。
raw需要调用两次分别分配redisObject和sdshdr的内存空间。
浮点数类型也是按照字符串值保存。
二.列表对象
列表对象保存的元素长度都小于64字节,并且元素数量小于512个时,编码为ziplist。
反之,编码为linkedlist。
三.哈希对象
哈希对象保存的元素长度都小于64字节,并且元素数量小于512个时,编码为ziplist。
反之,编码为hashtable。
四.集合对象
集合对象保存的所有元素都是整数值,并且元素数量不超过512个时,编码为intset。
反之,编码为hashtable。
五.有序集合
有序集合保存的元素数量小于128个,长度都小于64字节,编码为ziplist。
反之,编码为skiplist。
skiplist编码的有序集合对象使用zset结构实现,一个zset包含一个字典和一个跳跃表。
字典和跳跃表只保存一份元素的成员和分值,通过指针来实现共享元素。
字典根据成员查找分值效率高,跳表范围操作效率高,所以使用二者结合。
六.类型检查和多态
部分命令只能对特定对象类型执行。在执行特定命令时,redis先会检查类型是否正确。
根据对象的编码确定调用不同的命令函数实现多态。
七.内存回收
引用计数实现内存回收。
八.对象共享和计时
在redis中让多个键的值指针指向一个对象,并在共享的值对象的引用计数值加1。
lru记录对象最后一次被访问的时间。