Bootstrap

redis对象编码源码阅读——字符串编码过程

redis对象编码源码阅读——字符串编码过程

对于RAW类型的字符串,需要进一步进行编码,判断它是不是可以表示为整型数;更进一步地,看它能否成为共享变量。当然这都是为了节约内存。

/* Try to encode a string object in order to save space */
robj *tryObjectEncoding(robj *o) {
   
    long value;
    sds s = o->ptr;
    size_t len;

1. 判断是不是能编码

    /* 确保这是一个字符串对象,
    * 这是我们在这个函数中编码的唯一类型。
    * 其他类型使用编码的高效内存表示,但由实现该类型的命令处理。 */
    // 判断是不是字符串对象
    redisAssertWithInfo(NULL,o,o->type == REDIS_STRING);

    // 判断它的编码类型
    if (!sdsEncodedObject(o)) return o;

    // 判断它是不是共享对象,引用数是不是大于 1
    if (o->refcount > 1) return o;

2. 判断是不是能编码为INT

    /* 检查是否可以把这个字符串表示成一个长整数。
    * 请注意,大于21字符的字符串是不可表示为32位或64位整数的。 */
    len 
;