redis有五种基本的数据结构,分别是:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合),但这些只是Redis对外的数据结构。
实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的场景选择合适的内部编码。
我们可以通过object encoding命令查询内部编码
127.0.0.1:6379> set set:1 hello
OK
127.0.0.1:6379> object encoding set:1
"embstr"
127.0.0.1:6379> hset user:1 name kebi
(integer) 1
127.0.0.1:6379> object encoding user:1
"ziplist"
可以看到键set:1对应值的内部编码是“embstr”,键user:1对应值的内部编码是“ziplist”。
Redis这样设计有两个好处:
- 可以改进内部编码,而对外的数据结构和命令没有影响,这样一旦开发开发出优秀的内部编码,无需改动外部数据结构和命令。
- 多种内部编码实现可以在不同场景下发挥各自的优势。例如ziplist比较节省内存,但是在列表元素比较多的情况下,性能会有所下降,这时候Redis会根据配置选项将列表类型的内部实现转换为linkedlist。
字符串的内部编码
字符串类型的内部编码有3种:
- int:8个字节的长整型。
- embstr:小于等于44个字节的字符串。
- raw:大于44个字节的字符串。
Redis会根据当前值的类型和长度决定使用内部编码实现。
(1)整数类型示例如下:
127.0.0.1:6379> set str 1234567
OK
127.0.0.1:6379