一般的说法redis字符串内部编码有三种:
- int:8个字节的长整型;
- embstr:小于等于39个字节长度的字符串;
- raw:大于39个字节的字符串。
新版本
- int:8个字节的长整型;
- embstr:小于等于44个字节长度的字符串;
- raw:大于44个字节的字符串。
官方证明:https://github.com/antirez/redis/blob/unstable/src/object.c
#define OBJ_ENCODING_EMBSTR_SIZE_LIMIT 44
robj *createStringObject(const char *ptr, size_t len) {
if (len <= OBJ_ENCODING_EMBSTR_SIZE_LIMIT)
return createEmbeddedStringObject(ptr,len);
else
return createRawStringObject(ptr,len);
}
实际操作
127.0.0.1:6379> set test bug
OK
127.0.0.1:6379> setrange test 5 end
(integer) 8
127.0.0.1:6379> strlen test
(integer) 8
127.0.0.1:6379> object encoding test
"raw"
总结
实践出真知,但是源码看不太懂,