介绍
何为对象系统,为什么Redis需要有对象系统这个概念?
- 首先Redis中底层支持7中数据结构,sds、链表、字典、跳跃表、整数集合、压缩列表、快速列表分别用来实现5种数据类型。
- Redis支持5中数据类型(指的字典中值的类型),也叫做5中值类型即5中对象类型。包括字符串对象、列表对象、哈希对象、集合对象、有序集合对象。对于上述每一种对象都可以由几种数据结构实现,因此Redis作者将对象和数据结构关联起来,加上一层包装,那么上层代码使用起来不用关系底层细节。于是引出了对象系统。
//代表实现值类型的数据结构,因为某个值可以通过多种数据结构实现
#define OBJ_ENCODING_RAW 0 /* Raw representation 原始表示方式,sds */
#define OBJ_ENCODING_INT 1 /* Encoded as integer 整型*/
#define OBJ_ENCODING_HT 2 /* Encoded as hash table 字典*/
#define OBJ_ENCODING_ZIPMAP 3 /* Encoded as zipmap 不再使用了*/
#define OBJ_ENCODING_LINKEDLIST 4 /* No longer used: old list encoding. 双端链表,不在使用了 */
#define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist 压缩表*/
#define OBJ_ENCODING_INTSET 6 /* Encoded as intset 整数集*/
#define OBJ_ENCODING_SKIPLIST 7 /* Encoded as skiplist 跳跃表*/
#define OBJ_ENCODING_EMBSTR 8 /* Embedded sds string encoding embstr编码的sds*/
#define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists 由压缩列表组成的双向列表-->快速列表*/
//实际的值类型
#define OBJ_STRING 0 //字符串对象
#define OBJ_LIST 1 //列表对象
#define OBJ_SET 2 //集合对象
#define OBJ_ZSET 3 //有序集合对象
#define OBJ_HASH 4 //hash对象
//对象结构定义
typedef struct redisObject {
unsigned type:4;//何种对象,占4bits,共5种类型
unsigned encoding:4;//对象通过哪种的编码实现,占4bits,共10种类型
//实用LRU算法计算相对server.lruclock的LRU时间
unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
* LFU data (least significant 8 bits frequency
* and most significant 16 bits access time). */
int refcount;//引用计数
void *ptr;//指向底层数据实现的指针
} robj;
每个对象结构体中包含一个类型对象及实现其的编码。每个类型对象,至少可以使用两种数据结构体实现。通过encoding
属性来设定对象所使用的编码,而不是为特定类型的对象关联一种固定的编码,极大地提升了Redis的灵活性和效率,因为 Redis可以根据不同的使用场景来为一个对象设置不同的编码,从而优化对象在某一场景下的效率,根据实际的场景动态的切换编码类型。
下面是每个对象可以支持的数据结构类型。