redis底层编码格式
作者:bin下面介绍5种类型中使用到的编码格式,以及内部转换逻辑:
1、字符串对象
字符串对象的编码可以是int、embstr及raw。
字符长度>39字节,embstr转raw
int数据追加字符,int转raw
redis.xiaoying.work:6379> set hello world OK redis.xiaoying.work:6379> OBJECT ENCODING hello "embstr" redis.xiaoying.work:6379> set hello this_is_a_super_long_text_this_is_a_super_long_text OK redis.xiaoying.work:6379> OBJECT ENCODING hello "raw"
2、列表对象
列表对象的编码可以是ziplist 或者linkedlist。
列表有一个元素>64字节 或 列表列表总元素>512个,ziplist转linkedlist
redis.xiaoying.work:6379> lpush mylist 1 2 3 4 5 6 7 7 8 (integer) 9 //quicklist 实际上是 zipList 和 linkedList 的混合体 redis.xiaoying.work:6379> object encoding mylist "quicklist"
3、哈希对象
哈希对象的编码可以是ziplist或者hashtable。
哈希有一个元素>64字节 或 列表列表总元素>512个,ziplist转hashtable
redis.xiaoying.work:6379> hset myhash name1 hao (integer) 1 redis.xiaoying.work:6379> object encoding myhash "ziplist"
4、集合对象
集合对象的编码可以是intset或者hashtable。
集合有一个元素不是整数 或 集合元素总数>512个,intset转hashtable
redis.xiaoying.work:6379> sadd markset 1 2 3 (integer) 3 redis.xiaoying.work:6379> object encoding markset "intset" redis.xiaoying.work:6379> sadd markset s (integer) 1 redis.xiaoying.work:6379> object encoding markset "hashtable"
5、有序集合对象
有序集合对象的编码可以是ziplist或者skiplist。
有序集合有一个元素>64字节 或者 有序集合元素总数>128个,ziplist转skiplist
redis.xiaoying.work:6379> zadd myscoreset 100 hao 90 xiaohao (integer) 2 redis.xiaoying.work:6379> object encoding myscoreset "ziplist"