标签:
之前对redis基本的数据结构分别进行了简单的介绍,包括字符串、链表、哈希表、整数集合、压缩列表、压缩字典等,但是redis并不是直接使用这些数据结构来实现key-value对数据库的,而是基于这些数据结构为每一个对象创建一个对象robject。robject对象再根据数据类型,来选择合适的底层数据结构来存储数据。
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:REDIS_LRU_BITS; /* lru time */
int refcount;
void *ptr;
} robj;
- type:4bit,对象的类型
- encoding:4bit,对象的编码方式
- lru:24bit,记录访问时间
- refcount:引用计数
- ptr:指向具体的数据
对象的类型共有5种可选类型:
/* Object types */
#define REDIS_STRING 0
#define REDIS_LIST 1
#define REDIS_SET 2
#define REDIS_ZSET 3
#define REDIS_HASH 4
在redis中,key-value对中的键总是字符串类型的,只有值可以是多种类型中的一种,因此当我们称一个键为“字符串键”时,是指这个键对应的value是字符串类型的。
对象共有9种编码方式,每种类型可以有多种不同的编码方式:
#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 */
#define REDIS_ENCODING_EMBSTR 8 /* Embedded sds string encoding */
例如,当我们在客户端执行set msg “hello”命令时,那么在数据库中就会生成一个key-value对。redis会分别为key和value创建一个对象robject,对象的类型为字符串类型REDIS_STRING,对象的编码方式为REDIS_ENCODING_EMBSTR。当字符串长度较长时,则对象的编码方式会变为REDIS_ENCODING_RAW
http://doc.redisfans.com/
这个网站对redis数据库中命令进行了总结。
可以发现,对于不同的命令,底层会以不同的数据结构来实现,即不同的命令会导致对象的类型不同。
如执行set、get等命令时,生成的对象就是字符串类型的。然后底层根据对象的长度来选择合适的编码方式。
当执行hset、hget命令时,生成的对象就是哈希表类型的,然后再根据具体对象来选择不同的编码方式。
本文所引用的源码全部来自Redis3.0.7版本
redis学习参考资料:
https://github.com/huangz1990/redis-3.0-annotated
Redis 设计与实现(第二版)
标签:
原文地址:http://blog.csdn.net/u012658346/article/details/51346132