redis对象类型
redis并没有用我们先前提到的的主要数据结构:SDS,链表,字典,压缩列表,跳跃列表作为redis对象的直接实现.而是基于这些数据 结构创建一个对象系统.
这个系统包括了字符串对象,哈希对象,列表对象,集合对象和有序集合对象.每种对象都至少用到了一个我们前面介绍的数据结构.
一.对象类型以及编码
redis使用对象表示数据库中的键和值.每次新建一个键值对的时候,至少会创建两个对象,键对象和值对象.例如:set msg "hello".msg就是键对象,hello就是值对象.
redis每一个对象都是由一个redisObject来表示.
typedef struct redisObject {
unsigned type:4;//类型
unsigned encoding:4;//编码
unsigned lru:REDIS_LRU_BITS;
int refcount;/*引用计数*/
void *ptr;
} robj;
1.1 类型,编码格式以及它们的对应关系
对象的类型分别对应字符串对象,哈希对象,列表对象,集合对象和有序集合对象
#define REDIS_STRING 0
#define REDIS_LIST 1
#define REDIS_SET 2
#define REDIS_ZSET 3
#define REDIS_HASH 4
对象的编码分别对应之前介绍的八种基本类型
#define REDIS_ENCODING_RAW 0 /* Raw representation */
#define REDIS_ENCODING_INT 1 /* Encoded as integer */
#define REDIS_ENCODING_HT 2 /* Encoded as hash table */
#define REDIS_ENCODING_ZIPMAP 3 /* Encoded as zipmap */
#define REDIS_ENCODING_LINKEDLIST 4 /* Encoded as regular linked list */
#define REDIS_ENCODING_ZIPLIST 5 /* Encoded as ziplist */
#define REDIS_ENCODING_INTSET 6 /* Encoded as intset */
#define REDIS_ENCODING_SKIPLIST 7 /* Encoded as skiplist */
各类型的存储结构如下图所示: