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