前言
本文是Redis数据结构详解系列的最终篇。Redis数据结构详解(三)我们介绍了跳跃表与压缩列表,本篇将着重Redis的对象以及他们的编码方式。
Redis的对象
Redis中每一个对象都由一个redisObject结构表示。其定义如下:
typedef struct redisObject {
// 对象类型
unsigned type:4;
// 对象编码
unsigned encoding:4;
// LRU,用于过期淘汰策略
unsigned lru:LRU_BITS;
// 对象被引用次数
int refcount;
// 指向底层实现数据的指针
void *ptr;
} robj;
图示如下:
- type: 表示对象的类型,Redis支持的对象类型可以有String,List,Hash,Set以及ZSet
- encoding: 表示对象的编码,即对象底层实现的数据结构,后续会陆续介绍。
- refcount: 对象被引用的次数,Redis的对象回收使用的是引用计数法回收机制。
- ptr: 指向对象底层数据的指针
由上我们也可以发现,一个对象可以有多种编码方式。在Redis中,基本上所有的对象都由两种或两种以上的编码方式,根据不同的场景使用不同的编码方式,可以提高运行效率的同时节省一定的内存空间。
字符串对象(String)
字符串对象的编码方式可以有三种,分别是 int
,raw
,embstr
。
- 当字符串对象只保存了整数类型时,Redis会将编码类型设为
int
,使用Long整数类型保存数据。 - 当字符串保存的是一个字符串值,并且这个字符串值大于39字节,Redis会将编码类型设置为
raw
,使用SDS数据结构保存数据。 - 当字符串保存的是一个字符串值,并且这个字符串值小于等于39字节,Redis会将编码类型设置为
embstr
,也使用SDS数据结构保存数据。