数据类型

image.png

String / 字符串

string 类型是一个二进制安全的类型,因此可以包含任何数据,如:jpg 图片、序列化的对象。

  • 存储结构:动态字符串
  • 容量:512MB

    List / 列表

    简单的按插入顺序排序的字符串列表,可以将一个元素添加到列表的头部(左侧)或尾部(右侧)。

  • 数据存储结构:双向链表、压缩列表

  • 容量:232 - 1 个成员
  • 应用场景:类消息队列

    Hash / 哈希

    健值对集合。默认使用 “压缩列表”存储,在超出 hash-max-ziplist-entrieshash-max-ziplist-values 配置的阈值时切换到 “哈希表”存储,且过程不可逆

    hash-max-ziplist-entries:压缩列表中最大元素个数 hash-max-ziplist-values:压缩列表中单个元素的最大长度

  • 数据存储结构:压缩列表、哈希表

  • 容量:232 - 1 个健值对
  • 应用场景:存储对象类数据

    Set / 集合

    string 类型的无序集合,且不允许出现重复的成员。

  • 数据存储结构:哈希表、整数列表

  • 容量:232 - 1 个成员

    ZSet / Sorted Set / 有序集合

    string 类型的集合,且不允许出现重复的成员。每个元素都会关联一个可重复的 double 类型的分数,集合内的成员通过这个分数由小到大排序。

  • 数据存储结构:压缩列表、跳表

  • 容量:232 - 1 个成员
  • 应用场景:热搜

    存储结构

    dictEntry

    Redis 使用一个全局哈希表存储所有键值对,哈希表的每一项都是一个 dictEntry 结构,dictEntry 结构中存有三个 8 字节的大小的指针,分别指向了 key、value 以及下一个 dictEntry。由于 Redis 在分配内存时会分配最近的 2 的幂大小的内存空间,所以一个 dictEntry 占 3*8 = 24 ~= 32 字节。
    image.png

    RedisObject

    因为 Redis 的数据类型有很多,而且不同的数据类型具有相同的数据(如:最后访问时间、被引用次数等),所以 Redis 会使用 RedicObject 来记录这些数据以及一个指向实际数据的指针。其中元数据占 8 字节,指向实际数据的指针占 8 字节。
    image.png

    SDS

    String 类型的存储结构为简单动态字符串,简称 SDS(Simple Dynamic String)。
    SDS 由 len、alloc 以及 buf 组成,其中:

  • buf:字节数组,保存实际数据,结尾处有 \0 标识

  • len:字节数据已使用长度,占 4 字节
  • alloc:字节数据实际分配长度,占 4 字节

image.png
SDS 有三种编码方式,其中:

  • int 编码:数据为 Long 类型整数时,会将数据直接存储在 RedisObject 的 ptr 中。
  • embstr 编码:数据非 Long 类型整数 & 字符长度 <= 44 字节时,会为 RedisObject 和 SDS 分配一块连续的内存空间,避免内存碎片。
  • raw 编码:数据非 Long 类型证书 & 字符长度 > 44 字节时,会为 SDS 分配单独的内存空间。

image.png

压缩列表

压缩列表使用一块连续的内存空间存储数据,其中:

  • zlbytes:表示列表长度
  • zltail:表示列表头至列表尾的偏移量
  • zllen:表示列表内 entry 的个数
  • entry:数据元素
    1. prev_len:表示前一个 entry 的长度,< 255 时占 1 字节,否则占 5 字节长度
    2. encoding:编码方式,占 1 字节
    3. len:自身长度,占 4 字节
    4. content:保存实际数据
  • zlend:列表结束标识

image.png