之前相关联的文章:
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。
- 如果一个字符串对象保留的是整数值,并且这个值能够应用long类型示意,那么,字符串对象会将整数值保留在字符串对象构造的ptr属性里,并将字符串编码设置为int。
- 如果字符串对象保留的是一个字符串,且这个字符串值的长度大于39(redis 3.2版本后为44)字节,那么,字符串对象将应用一个SDS保留这个字符串值,且将编码设置为raw;否则编码设置为embstr。
embstr与raw两种编码的不同点:
embstr编码 | raw编码 |
---|---|
字符串对象所有数据所存内存是间断的 | 字符串对象数据所存内存非间断 |
内存申请一次,开释一次 | 内存申请两次,开释也是两次 |
最初,字符串最长可存512M:
StringsStrings 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 深刻了解