数据类型
String / 字符串
string 类型是一个二进制安全的类型,因此可以包含任何数据,如:jpg 图片、序列化的对象。
- 存储结构:动态字符串
-
List / 列表
简单的按插入顺序排序的字符串列表,可以将一个元素添加到列表的头部(左侧)或尾部(右侧)。
数据存储结构:双向链表、压缩列表
- 容量:232 - 1 个成员
-
Hash / 哈希
健值对集合。默认使用 “压缩列表”存储,在超出
hash-max-ziplist-entries
或hash-max-ziplist-values
配置的阈值时切换到 “哈希表”存储,且过程不可逆hash-max-ziplist-entries:压缩列表中最大元素个数 hash-max-ziplist-values:压缩列表中单个元素的最大长度
数据存储结构:压缩列表、哈希表
- 容量:232 - 1 个健值对
-
Set / 集合
string 类型的无序集合,且不允许出现重复的成员。
数据存储结构:哈希表、整数列表
-
ZSet / Sorted Set / 有序集合
string 类型的集合,且不允许出现重复的成员。每个元素都会关联一个可重复的 double 类型的分数,集合内的成员通过这个分数由小到大排序。
数据存储结构:压缩列表、跳表
- 容量:232 - 1 个成员
-
存储结构
dictEntry
Redis 使用一个全局哈希表存储所有键值对,哈希表的每一项都是一个 dictEntry 结构,dictEntry 结构中存有三个 8 字节的大小的指针,分别指向了 key、value 以及下一个 dictEntry。由于 Redis 在分配内存时会分配最近的 2 的幂大小的内存空间,所以一个 dictEntry 占 3*8 = 24 ~= 32 字节。
RedisObject
因为 Redis 的数据类型有很多,而且不同的数据类型具有相同的数据(如:最后访问时间、被引用次数等),所以 Redis 会使用 RedicObject 来记录这些数据以及一个指向实际数据的指针。其中元数据占 8 字节,指向实际数据的指针占 8 字节。
SDS
String 类型的存储结构为简单动态字符串,简称 SDS(Simple Dynamic String)。
SDS 由 len、alloc 以及 buf 组成,其中: buf:字节数组,保存实际数据,结尾处有
\0
标识- len:字节数据已使用长度,占 4 字节
- alloc:字节数据实际分配长度,占 4 字节
SDS 有三种编码方式,其中:
- int 编码:数据为 Long 类型整数时,会将数据直接存储在 RedisObject 的 ptr 中。
- embstr 编码:数据非 Long 类型整数 & 字符长度 <= 44 字节时,会为 RedisObject 和 SDS 分配一块连续的内存空间,避免内存碎片。
- raw 编码:数据非 Long 类型证书 & 字符长度 > 44 字节时,会为 SDS 分配单独的内存空间。
压缩列表
压缩列表使用一块连续的内存空间存储数据,其中:
- zlbytes:表示列表长度
- zltail:表示列表头至列表尾的偏移量
- zllen:表示列表内 entry 的个数
- entry:数据元素
- prev_len:表示前一个 entry 的长度,< 255 时占 1 字节,否则占 5 字节长度
- encoding:编码方式,占 1 字节
- len:自身长度,占 4 字节
- content:保存实际数据
- zlend:列表结束标识