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数组中会有