查看某个对象使用的编码,可以使用命令:
redis> OBJECT ENCODING key
1、字符串对象(String)
1、编码方式
- int:保存的是整数值,并且可以用long类型表示;
- raw:保存字符串(包括浮点数),并且长度大于39字节;
- embstr:只读,修改会变更为row,保存字符串(包括浮点数),并且长度小于等于39字节;
2、编码转换
- int => raw:执行命令后,对象保存的值变更为字符串值时,自动转换;
- embstr => raw:对象执行修改之后就会转换;
3、结构图
-
int
-
raw
-
embstr
2、列表对象(List)
1、编码方式
- ziplist:压缩列表,支持从两端添加,使用整块内存存储,每个节点保存一个列表元素;
- linkedlist:双端链表,链表结构,每个节点保存一个字符串对象,每个字符串对象都保存一个列表元素;
2、编码转换
同时满足以下两种条件,使用ziplist编码,其他使用linkedlist
下面条件中的上限值可以修改配置文件
- 保存的所有字符串元素的长度都小于64字节;
- 列表保存的元素数量小于512个;
3、结构图
-
ziplist
-
linkedlist
3、哈希对象(Hash)
1、编码方式
- ziplist:压缩列表,从表尾添加,先保存键的节点,再保存值得列表节点;
- hashtable:字典,每个键、值都是字符串对象,字符串对象中保存了相应的键和值;
2、编码转换
同时满足以下两种条件,使用ziplist编码,其他使用hashtable
下面条件中的上限值可以修改配置文件
- 所有键值对的键和值得字符串长度都小于64字节;
- 键值对的数量小于512个;
3、结构图
-
ziplist
-
hashtable
4、集合对象(Set)
1、编码方式
- intset:整数集合,所有元素都保存在整数集合里面;
- hashtable:字典,每个键都是字符串对象,其中包集合元素,字典的值都为null;
2、编码转换
集合对象同时满足以下两个条件,使用intset编码,其他使用hashtable编码
下面条件中的上限值可以修改配置文件
- 所有元素都是整数值;
- 元素数量不超过512;
3、结构图
-
insetset
-
hashtable
5、有序集合对象(Zset)
1、编码方式
- ziplist:压缩列表,每个元素两个节点,分别为元素和对应的分支,元素按分值从小到大排序;
- skiplist:跳表+字典,跳表保证顺序操作,字典保证取数据O(1);
2、编码转换
集合对象同时满足以下两个条件,使用ziplist编码,其他使用skiplist编码
下面条件中的上限值可以修改配置文件
- 元素数少于128个;
- 所有元素的长度都小于64字节;
3、结构图
-
ziplist
-
skiplist