1、介绍
Redis的基本类型有5种:string、list、hash、set、zset,不同类型对应的底层结构不同,接下来就简单介绍一下其采用的什么底层结构。
2、底层结构对照
数据类型 | 底层实现结构 | 触发条件 |
---|---|---|
string | 1、int编码(8字节长整型) 2、embstr编码(≤44字节字符串) 3、raw编码(>44字符串) |
1、纯数字时用int 2、短字符串用embstr(内存连续) 3、长字符串用raw(分配独立内存) |
list | 1、ziplist(压缩列表) 2、linkedlist(双向链表) 3、quicklist(3.2+版本默认) |
1、元素数量 ≤ list-max-ziplist-entries(默认512) 所有元素大小 ≤ list-max-ziplist-value(默认64字节) 2、不满足ziplist条件 3、quicklist是ziplist+linkedist的混合结构 |
hash | 1、ziplist 2、hashtable(哈希表) |
1、字段数量 ≤ hash-max-ziplist-entries (默认512) 所有元素大小 ≤ hash-max-ziplist-value(默认64字节) 2、不满足ziplist的使用条件 |
set | 1、intset(整数集合) 2、hashtable |
1、所有元素为整数且数量 ≤ set-max-intset-entries(默认512) 2、非整数或超量时转hashtable |
zset | 1、ziplist 2、skiplist(跳跃表)+ dict(字典) |
1、元素数量 ≤ zset-max-ziplist-entries(默认128) 所有元素大小 ≤ zset-max-ziplist-value(默认64字节) 2、不满足ziplist条件 |
3、关键配置参数
参数名 | 默认值 | 作用 |
---|---|---|
list-max-ziplist-entries | 512 | list使用ziplist的最大元素数量 |
list-max-ziplist-value | 64 | list元素的最大字节数 |
hash-max-ziplist-enties | 512 | hash使用ziplist的最大字段数 |
hash-max-ziplist-value | 64 | hash字段值的最大字节数 |
set-max-intset-entries | 512 | set使用intset的最大元素数量 |
zset-max-ziplist-entries | 128 | zset使用ziplist的最大元素数量 |
zset-max-ziplist-value | 64 | zset元素最大字节数 |
4、底层结构演进特点
内存优化优先
小数据时优先使用紧凑结构(ziplist/intset)
自动转换机制
数据增长超出阈值时自动转为高性能结构
版本差异
1、list在3.2版本后统一用quicklist
2、Redis 7.0引入listpack替代部分ziplist场景