乐趣区

关于redis:redis学习之七字符串对象

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

先再看一下 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 编码
字符串对象所有数据所存内存是间断的 字符串对象数据所存内存非间断
内存申请一次,开释一次 内存申请两次,开释也是两次

最初,字符串最长可存 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 深刻了解

退出移动版