之前相关联的文章:
redis学习之一SDS
redis学习之二双端链表
redis学习之三字典
redis学习之四skiplist
redis学习之五ziplist
redis学习之六对象

说明:本文是基于redis2.9版本

先再看一下redisObject的定义:

typedef struct redisObject{
    //类型
    unsigned type:4;
    //编码
    unsigned encoding:4;
    //lru缓存淘汰机制信息
    unsigned lru:LRU_BITS;
    //引用计数器
    int refcount;
    //指向底层实现数据结构的指针
    void *ptr;
}robj;

字符串对象的编码可以是int、raw或embstr。

  1. 如果一个字符串对象保存的是整数值,并且这个值可以使用long类型表示,那么,字符串对象会将整数值保存在字符串对象结构的ptr属性里,并将字符串编码设置为int。
  2. 如果字符串对象保存的是一个字符串,且这个字符串值的长度大于39(redis 3.2版本后为44)字节,那么,字符串对象将使用一个SDS保存这个字符串值,且将编码设置为raw;否则编码设置为embstr。

embstr与raw两种编码的不同点:

embstr编码raw编码
字符串对象所有数据所存内存是连续的字符串对象数据所存内存非连续
内存申请一次,释放一次内存申请两次,释放也是两次

raw编码的字符串对象:
image.png

embstr编码的字符串对象:
image.png

下面是不同编码的示意图:
image.png

最后,字符串最长可存512M:

Strings
Strings are the most basic kind of Redis value. Redis Strings are binary safe, 
this means that a Redis string can contain any kind of data, 
for instance a JPEG image or a serialized Ruby object.
A String value can be at max 512 Megabytes in length.

参考的文章有:
黄健宏的《Redis设计与实现》一书
Redis开发与运维:SDS与embstr、raw 深入理解


步履不停
38 声望13 粉丝

好走的都是下坡路