Redis设计原理

  • 2019 年 10 月 3 日
  • 筆記

1.简介

 

Redis中的每个Key-Value在内存中都会被划分成DictEntry、RedisObject以及具体对象,其中DictEntry又分别包含指向Key和Value的指针(以RedisObject的形式)以及指向下一个DictEntry的指针。

 

 

 

 

Key固定是字符串,因此使用字符串对象来进行表示,Value可以是字符串、列表、哈希、集合、有序集合对象中的任意一种。

Redis提供了五种对象,每种对象都需要使用RedisObject进行表示。

 

Redis使用redisObject结构来表示对象(存储对象的相关信息)

typedef struct redisObject {      unsigned type;      unsigned encoding;      unsigned lru;      int refcount;      void *ptr;  }robj;

type属性:存储对象的类型(String、List、Hash、Set、ZSet中的一种)

encoding属性:存储对象使用的编码方式,不同的编码方式使用不同的数据结构进行存储。

lru属性:存储对象最后一次被访问的时间。

refcount属性:存储对象被引用的次数。

*ptr指针:指向对象的地址。

 

使用type命令可以查看对象的类型。

使用object encoding命令可以查看对象使用的编码方式。

使用object idletime命令可以查看对象的空转时间(即多久没有被访问,并不会刷新当前RedisObject的lru属性)

使用object refcount命令可以查看对象被引用的次数。

*这些命令都是通过Key找到对应的Value再从Value对应的RedisObject中进行获取。

 

 

2.字符串

 

Redis没有直接使用C语言的字符串,而是自定义了一种字符串类型,以对象的形式存在(C语言的字符串只是单纯的字面量,不能够进行修改)

Redis使用sdshdr结构来表示字符串对象(SDS)

struct sdshdr {      int len;      int free;      char buf[];  };

len属性:字符串的长度。

free属性:未使用的字节数量。

buf数组:字符串的底层实现用于存储字符。

 

*buf数组中会有