string对象的底层编码

Redis对象层

Posted by 冯伟源 on May 12, 2015

string对象的底层编码

1. REDIS_ENCODING_INT

  • 又叫长整型编码
  • 如果对象保存的是整数值,一般可以用long int类型来表示;
  • 现在很多服务器上,long int是64位的,所以当你保存一个 (-2^64/2,2^64/2)时,会用该底层编码保存;
  • 它直接依赖了C的数据类型,而没有依赖redis的任何底层支撑(如sds,intset等);

2. REDIS_ENCODING_EMBSTR

  • 直接使用了SDS数据结构来作为对象的底层编码;
  • 字符串长度如小于等于32字节,一次分配内存,object与底层sds在内存上是连续的;

3. REDIS_ENCODING_RAW

  • 直接使用了SDS数据结构来作为对象的底层编码;
  • 所不同的是,两次分配内存,内存不相邻;
  • 字符串长度大于32字节的,会使用;
  • 不一定是32字节,在新版本上,宏的默认值会有所不同;

4. 编码的转换

  • int、embstr编码的字符串对象,在条件满足的情况下,会被转换为raw编码的字符串对象;
  • 对key执行命令使key保存的不再是整数值,而是字符串值,就会发生int->raw;
  • embstr编码的字符串对象是只读的,所以对embstr编码的字符串对象执行任何修改命令时,就会变成raw编码;
set number 1024
object encoding number  #原来是int编码
append number " is a good number"
object encoding number  #转换成了raw编码
set msg "hello"                   
object encoding msg   #embstr
append msg " again!"
object encoding msg  #raw

5. 不同编码下String命令的实现

image