Redis每种数据结构都有自己底层的内部编码实现,而且是多种实现。
如图:

redist value string 乱码 redis编码字符集_redis

目录

字符串

哈希

列表

集合

有序集合


字符串

1.三种编码:
int:8个字节的长整型
embstr:小于等于39个字节的字符串
raw:大于39个字节的字符串
Redis会根据当前值的类型和长度决定使用哪种内部编码实现
2.例子
整数类型示例如下:

set m 6666
 object encoding m


短字符串示例如下:

#小于等于39个字节的字符串:embstr
 set m "hello"
 object encoding m


长字符串示例如下:

#大于39个字节的字符串:raw
 set m "Redis is an open source (BSD licensed)..."
 object encoding m
 strlen m

哈希

1.两种编码:
ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、
同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,redis会使用ziplist作为哈希的内部实现,
ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
hashtable(哈希表):当哈希类型无法满足ziplist的条件时,redis会使用hashtable作为哈希的内部实现,
因此此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)
2.例子
1)当field个数比较少且没有大的value时,内部编码为ziplist

hmset m f1 v1 f2 v2
 object encoding m


2.1)当有value大于64字节,内部编码会由ziplist变为hashtable:

hset m f3 "Redis is an open source (BSD licensed), in-memory data structure store, used as a database..."
  object encoding m


2.2)当field个数超过512,内部编码也会由ziplist变为hashtable:

hmset m f1 .....f513
 object encoding m

列表

1.两种编码:
ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置(512个),同时列表中每个元素的值都小于
list-max-ziplist-value配置(64个),redis会选用ziplist来作为列表的内部实现来减少内存的使用.
linkedlist(链表):当列表类型无法满足ziplist的条件时,redis会使用linkedlist作为列表的内部实现。
2.例子
1)当元素个数较少且没有大元素时,内部编码为ziplist:

rpush m a1 a2 a3
 object encoding m


2.1)当元素个数超过512个,内部编码变为linkedlist:

rpush m a1...a513
 object encoding m


2.2)或者当某个元素超过64字节,内部编码也会变为linkedlist:

rpush m "Redis is an open source (BSD licensed), in-memory data structure store, used as a database..."
 object encoding m


注:Redis3.2版本提供了quicklist内部编码,简单地说它是以一个ziplist为节点的linkedlist,它结合了ziplist和linkedlist两者的优势,为列表类型提供了一
种更为优秀的内部编码实现,它的设计原理可以参考Redis的另一个作者Matt Stancliff的博客:https://matt.sh/redis-quicklist。

集合

1.两种编码:
intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-ziplist-entries配置(512)时,redis会选用intset来作为集合的内部实现,从而减少内存的使用
hashtable(哈希表):当集合类型无法满足intset的条件时,redis会使用hashtable作为集合的内部实现
2.例子:
1)当元素个数较少且都为整数时,内部编码为intset:

sadd m 1 2 3 4
 object encoding m


2.1)当元素的个数超过512个,内部编码变为hashtable:

sadd m 1...513
 scard setkey
 object encoding m


2.2)当某个元素不为整数时,内部编码也会变为hashtable

sadd m a
 object encoding m

有序集合

1.两种编码:
ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(64个)时,
redis会用ziplist来作为有序集合的内部实现,ziplist可以有效的减少内存的使用.
skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部的实现,因为此时ziplist的读写效率会下降.
2.例子:
1)当元素个数较少且每个元素较小shi,内部编码为skiplist:

zadd m 50 a1 60 a2 30 a3
 object encoding m


2)当元素个数超过128个,内部编码变为ziplist:

zadd m 50 a1 60 a2 84 a129
 object encoding m


2.2)当某个元素大于64字节时,内部编码也会变为hashtable:

zadd m  20 "Redis is an open source (BSD licensed), in-memory data structure store, used as a database..."
 object encoding m