redis学习笔记(9)---对象robject

robject

  之前对redis基本的数据结构分别进行了简单的介绍,包括字符串、链表、哈希表、整数集合、压缩列表、压缩字典等,但是redis并不是直接使用这些数据结构来实现key-value对数据库的,而是基于这些数据结构为每一个对象创建一个对象robject。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:指向具体的数据

1)类型

  对象的类型共有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是字符串类型的。

2)编码方式

  对象共有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 设计与实现(第二版)
  
 
  
  

你可能感兴趣的:(redis学习笔记(9)---对象robject)