每次redis在数据库中新建一个键值对的时候,都要创建两个对象,一个作为键,一个作为值
type 记录了对象类型(字符串 列表 哈希 集合 有序集合)
encoding记录了对象所使用的编码,即这个对象使用什么数据结构作为对象的底层实现(long类型的整数 sds 字典 双端链表 压缩列表 整数集合 跳跃表和字典)
字符串对象
整数型字符串
上图是使用sds实现字符串
embstr编码 也是使用redisobject和sds结构,只是保存的字符串长度小于等于32字节,而且只会调用一次内存分配函数分配一块连续的空间,如下图
列表对象
列表对象的编码可以是ziplist或者linkedlist
哈希对象
哈希对象的编码可以是ziplist或者hashtable
hash编码的哈希对象使用字典作为底层实现
集合对象
集合对象的编码可以是intset或者hashtable
有序集合对象
有序集合对象的编码可以是ziplist或者skiplist
内存回收
C语言不具有自动回收内存的功能,在redisobject中有个一个计数的字段,新建redisobject时计数字段为一,当为零时,回收内存
对象共享
redis在初始化服务器时,会创建一万个字符串对象,0-9999,当服务器用到这些值时,就会共享使用。