字符创对象(REDIS_STRING | string)
整数值(int)
embstr编码的简单动态字符串(SDS)(embstr)
动态字符串(raw)
编码存储选择
如果字符串对象保存的是一个字符串值, 并且这个字符串值的长度大于 39 字节, 那么字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值, 并将对象的编码设置为 raw
如果字符串对象保存的是一个字符串值, 并且这个字符串值的长度小于等于 39 字节, 那么字符串对象将使用 embstr 编码的方式来保存这个字符串值
可以用 long double 类型表示的浮点数在 Redis 中也是作为字符串值来保存的: 如果我们要保存一个浮点数到字符串对象里面, 那么程序会先将这个浮点数转换成字符串值, 然后再保存起转换所得的字符串值
编码转换
对于 int 编码的字符串对象来说, 如果我们向对象执行了一些命令, 使得这个对象保存的不再是整数值, 而是一个字符串值, 那么字符串对象的编码将从 int 变为 raw
因为 Redis 没有为 embstr 编码的字符串对象编写任何相应的修改程序 (只有 int 编码的字符串对象和 raw 编码的字符串对象有这些程序), 所以 embstr 编码的字符串对象实际上是只读的: 当我们对 embstr 编码的字符串对象执行任何修改命令时, 程序会先将对象的编码从 embstr 转换成 raw , 然后再执行修改命令; 因为这个原因, embstr 编码的字符串对象在执行修改命令之后, 总会变成一个 raw 编码的字符串对象
列表对象(REDIS_LIST | list)
压缩列表(ziplist)
双端链表(linkedlist)
编码存储选择
当列表对象可以同时满足以下两个条件时, 列表对象使用 ziplist 编码:
1、列表对象保存的所有字符串元素的长度都小于 64 字节;
2、列表对象保存的元素数量小于 512 个
哈希对象(REDIS_HASH | hash)
压缩列表(ziplist)
字典(hashtable)
编码转换
当哈希对象可以同时满足以下两个条件时, 哈希对象使用 ziplist 编码:
1、哈希对象保存的所有键值对的键和值的字符串长度都小于 64 字节;
2、哈希对象保存的键值对数量小于 512 个;
集合对象(REDIS_SET | set)
整数集合(intset)
字典(hashtable)
编码转换
当集合对象可以同时满足以下两个条件时, 对象使用 intset 编码:
1、集合对象保存的所有元素都是整数值;
2、集合对象保存的元素数量不超过 512 个;
有序集合对象(REDIS_ZSET | zset)
压缩列表(ziplist)
跳跃表和字典(skiplist)
编码转换
当有序集合对象可以同时满足以下两个条件时, 对象使用 ziplist 编码:
1、有序集合保存的元素数量小于 128 个;
2、有序集合保存的所有元素成员的长度都小于 64 字节;
友情提示
查看一个key的编码类型:OBJECT ENCODING key