目录
- 内部编码
- string
- hash
- list
- set
- zset
内部编码
- redis有五大基本类型,而在这些基本类型中还有不同的内部编码,通过object encoding key,可以查看该键的内部编码,这样对外来说redis只有五种基础类型,当其对内部编码改进时,基础类型不会发生改变。并且redis会根据你的值来判断使用那种方式的内部编码效率会更高,所以并不是说一直是一个类型
string
- string类型其内部编码有三种格式,分别是int,raw和embstr,之前我们就说过并不是由我们来指定其内部编码,而是存入的值来决定的。
- int:肯定要求值必须为整数类型,而且当数字在0~9999之间时,因为redis在启动时会创建10000个共享对象,所以在存值的时候如果在此数值之间则会将该键的引用指向该共享对象;需要注意的是当通过配置文件参数 maxmemory 设置了 Redis 可用的最大空间大小时,Redis不会使用共享对象,因为对于每一个键值都需要使用一个 redisObject 来记录其LRU信息
- embstr:适用于当存入的值小于等于44个字节的字符串
- raw:存入的字符串超过44个字节时将转换为raw编码,但当内部编码为embstr的键值对使用append 命令对值进行修改时,无论当前字符串的长度为多少,其内部编码都将转换为raw
hash
- ziplist(压缩列表):当hash类型中每个value的长度不超过64字节,并且filed-value长度不超过512,在redis的配置文件中可以对这两个阈值进行修改
- hashtable(哈希表):当ziplist编码的hash类型键值对超过任一阈值时,其内部编码就会转换为hashtable,其hashtable的原理跟hashmap类似。
list
- v3.2之前
- ziplist(压缩列表):list中使用的ziplist是与hash相同的内部编码,当元素长度不超过512或者单个元素的大小不超过64字节,list类型的键值对就会使用ziplist作为内部编码,在对应的配置文件中也可以调整对应的阈值
- linkedlist(链表):当元素长度超过512或单个元素长度超过64时,键值对就会采用linkedlist作为其内部编码
- v3.2 :
- quicklist(快速列表):在继v3.2之后list类型就只使用了quicklist一种内部编码,quicklist集ziplist以及linkedlist于一身,是以ziplist作为节点的linkedlist;
set
- intset(整数集合):当存入集合的成员都是整数并且成员数不超过512条时,其内部编码使用intset,在配置文件中可以对intset的阈值进行修改,当然默认是512
- hashtable(哈希表):当存入集合的数据不满足intset的条件时将自动转换为hashtable
zset
- ziplist(压缩列表):默认当存入集合的成员数不超过128个且成员的最大字节数不超过64时,使用的ziplist的内部编码,当然redis允许对其阈值进行修改。
- skiplist(跳跃表):当不满足设定的阈值时,zset的内部编码将自动转换为skiplist。