0%

redisObject

对象

redis中用对象来表示数据库中的键值,每一个键值对由两个对象(键对象和值对象)表示。redis中的键对象存在键空间(一个字典)中,与值对象相对应。

对象由redisObject结构表示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
typedef struct redisObject {

// 类型
unsigned type:4;

// 编码
unsigned encoding:4;

// 对象最后一次被访问的时间
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;

如下图所示,redis对象共占16字节

redisObject

类型(type)

redis的对象类型共有5种,便是我们熟悉的字符串、列表、集合、有序集合和哈希。这五种在redis中对应为

1
2
3
4
5
#define OBJ_STRING 0    /* String object. */
#define OBJ_LIST 1 /* List object. */
#define OBJ_SET 2 /* Set object. */
#define OBJ_ZSET 3 /* Sorted set object. */
#define OBJ_HASH 4 /* Hash object. */

可使用TYPE key命令获取对象类型,得到的是该key对应的值对象的类型

1
2
3
4
5
redis> SADD numbers 1 2 3
(integer) 3

redis> TYPE numbers
set

编码(encoding)

编码表示的是对象的底层数据结构,在redis中有如下编码

1
2
3
4
5
6
7
8
9
10
11
#define OBJ_ENCODING_RAW 0        /* 简单动态字符串 */
#define OBJ_ENCODING_INT 1 /* long类型整数 */
#define OBJ_ENCODING_HT 2 /* 哈希表 */
#define OBJ_ENCODING_ZIPMAP 3 /* zipmap */
#define OBJ_ENCODING_LINKEDLIST 4 /* 不再使用,老的链表编码 */
#define OBJ_ENCODING_ZIPLIST 5 /* 压缩链表 */
#define OBJ_ENCODING_INTSET 6 /* 整数集合 */
#define OBJ_ENCODING_SKIPLIST 7 /* 跳表 */
#define OBJ_ENCODING_EMBSTR 8 /* Embedded字符串 */
#define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */
#define OBJ_ENCODING_STREAM 10 /* Encoded as a radix tree of listpacks */

可使用OBJECT ENCODING key命令查看key对应值对象的编码

1
2
3
4
5
redis> SADD numbers 1 2 3
(integer) 3

redis> OBJECT ENCODING numbers
"intset"