Redis底层数据结构学习笔记(1)

30 阅读2分钟

1、Redis数据在底层是什么样的

在应⽤层⾯,我们熟悉Redis有多种不同的数据类型,⽐如string,hash,list,set,zset等。但是这些数据在Redis的底层是什么样子呢?实际上Redis提供了⼀个指令OBJECT可以⽤来查看数据的底层类型。

图片.png

可以看到,k1 v1这个<k,v>键值对,他在底层的数据类型就是 embstr 。Redis在底层,其实是这样描述这些数据类型的。

< server.h 880⾏>

图片.png

图片.png

Redis是⼀个<k,v>型的数据库,其中key通常都是string类型的字符串对象,⽽value在底层就统⼀是redisObject对象。⽽这个redisObject结构,实际上就是Redis内部抽象出来的⼀个封装所有底层数据结构的统⼀对象。这就类似于Java的⾯向对象的设计⽅式。

这⾥⾯⼏个核⼼字段意义如下:

  • type:Redis的上层数据类型。⽐如string,hash,set等,可以使⽤指令type key查看。
  • encoding: Redis内部的数据类型。
  • lru:当内存超限时会采⽤LRU算法清除内存中的对象。关于LRU与LFU,在redis.conf中有描述
# LRU means Least Recently Used
# LFU means Least Frequently Used
  • refcount:表示对象的引⽤次数。可以使⽤OBJECT REFCOUNT key 指令查看。
  • *ptr:这是⼀个指针,指向真正底层的数据结构。encoding只是⼀个类型描述。实际数据是保存在ptr指向的具体结构⾥。

2、Redis常⻅数据类型的底层数据结构总结

我们已经知道了Redis有上层的应⽤类型,也有底层的数据结构。那么这些上层数据类型和底层数据结构是怎么对应的呢?

图片.png

这就是⼀种对应关系。也就是说,在应⽤层⾯,我们操作的是string这样的数据类型,但是Redis在底层,操作的是embstr这样⼀种数据结构。但是,这些上层的数据类型和底层的数据结构之间,是不是就是简单的⼀⼀对应的关系呢?

图片.png 从这⾥能够看到,每⼀种上层数据类型对应底层多种不同的数据结构,也就是说,同样的⼀个数据类型,Redis底层的处理⽅式是不同的。

图片.png

现在搞明⽩encoding是什么了之后,问题就到了下一步,这个ptr指针到底指向了哪些数据结构呢?

下⾯直接列出了Redis中上层数据类型和底层真正存储数据的数据结构的对应关系。

图片.png