字符串对象的编码可以是int、embstr或者raw。
对象中不同类型的适用条件:
- OBJ_ENCODING_INT:字符串保存的内容是整数,而且这个整数可以用一个long型来表示;
- OBJ_ENCODING_EMBSTR:字符串保存的内容是长度小于等于44(老版是39)字节的字符串,或者长度符合前面条件并且能用long double表示的浮点数;
- OBJ_ENCODING_RAW:字符串保存的内容是长度大于44(老版是39)字节的字符串;
注:embstr与raw的区别在于把redisObject和sdshdr两块内存一次性合并申请,减少了内存的申请和释放操作次数,同时又利用上了空间局部性。
对象类型的结构图
-
int编码类型
int类型.PNG
-
embstr编码类型
embstr类型.PNG
-
raw编码类型
raw类型.PNG
对象类型的转换:
从一般来说都是沿着以下方向转换,也可以逆方向来优化
int <--> embstr <--> raw
但是embstr并未提供扩容操作,所以embstr一旦转换不管长度是多少,都会变成raw类型
127.0.0.1:6379> set pi 3.14
OK
127.0.0.1:6379> object encoding pi
"embstr"
127.0.0.1:6379> append pi "15"
(integer) 6
127.0.0.1:6379> get pi
"3.1415"
127.0.0.1:6379> object encoding pi
"raw"
网友评论