Redis 七 - 对象系统

Redis 七 - 对象系统

Redis 并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象

主要涉及文件 redis.h

定义

1
2
3
4
5
6
7
8
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */
int refcount;
/* point to the implementation data structure */
void *ptr;
} robj;

我们使用 TYPE 命令返回的是数据库键对应的值对象的类型:

1
2
3
4
127.0.0.1:6379> SET msg "hello world"
OK
127.0.0.1:6379> TYPE msg
string

总共定义了五种类型:

1
2
3
4
5
6
/* Object types */
#define REDIS_STRING 0
#define REDIS_LIST 1
#define REDIS_SET 2
#define REDIS_ZSET 3
#define REDIS_HASH 4

编码

encoding 记录了这个对象所使用的编码,记录了这个对象到底使用了什么数据结构作为对象的底层实现:

1
2
3
4
5
6
7
8
9
10
11
12
/* Objects encoding. Some kind of objects like Strings and Hashes can be
* internally represented in multiple ways. The 'encoding' field of the object
* is set to one of this fields for this object. */
#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 */

使用 OBJECT ENCODING 可以查看一个数据库键的值对象的编码:

1
2
3
4
127.0.0.1:6379> SET msg "hello world"
OK
127.0.0.1:6379> OBJECT ENCODING msg
"embstr"

字符串对象

推荐文章