字符串

REDIS_STRING (字符串)是 Redis 使用得最为广泛的数据类型, 它除了是 SETGET 等命令的操作对象之外, 数据库中的所有键, 以及执行命令时提供给 Redis 的参数, 都是用这种类型保存的。

字符串编码

字符串类型分别使用 REDIS_ENCODING_INTREDIS_ENCODING_RAW 两种编码:

  • REDIS_ENCODING_INT 使用 long 类型来保存 long 类型值。

  • REDIS_ENCODING_RAW 则使用 sdshdr 结构来保存 sds (也即是 char* )、 long longdoublelong double 类型值。

换句话来说, 在 Redis 中, 只有能表示为 long 类型的值, 才会以整数的形式保存, 其他类型的整数、小数和字符串, 都是用 sdshdr 结构来保存。

digraph redis_string {

    node[shape=plaintext, style = filled];

    edge [style = bold];

    // type

    REDIS_STRING [label="字符串\nREDIS_STRING", fillcolor = "#95BBE3"];

    // encoding

    REDIS_ENCODING_RAW [label="字符串\nREDIS_ENCODING_RAW", fillcolor = "#FADCAD"];
    REDIS_ENCODING_INT [label="整数\nREDIS_ENCODING_INT", fillcolor = "#FADCAD"];

    // edge

    REDIS_STRING -> REDIS_ENCODING_RAW;
    REDIS_STRING -> REDIS_ENCODING_INT;

    REDIS_ENCODING_RAW -> sdshdr;
    REDIS_ENCODING_INT -> long;

    // datastruct 1

    sdshdr [label="sdshdr"];
    sds [label="sds/char*"];
    long_long [label="long long"];
    double [label="double"];
    long_double [label="long double"];

    sdshdr -> sds;
    sdshdr -> long_long;
    sdshdr -> double;
    sdshdr -> long_double;

    // datastruct 2

    long [label="long"];
    long_type [label="long"];

    long -> long_type;


}

编码的选择

新创建的字符串默认使用 REDIS_ENCODING_RAW 编码, 在将字符串作为键或者值保存进数据库时, 程序会尝试将字符串转为 REDIS_ENCODING_INT 编码。

字符串命令的实现

Redis 的字符串类型命令, 基本上是通过包装 sds 数据结构的操作函数来实现的, 没有什么需要说明的地方。