第一部分 数据结构与对象

  • Redis是键值数据库。键通常是字符串对象,值有五种可能的对象:字符串,列表,哈希,集合,有序集合。第一部分是介绍这五种对象,剖析其底层数据结构,以及该数据结构对其功能和性能的影响
  • Redis是由C语言编写,所以出现的源码皆为C语言,其他语言会另外声明。

1. 简单动态字符串(simple dynamic string,SDS)

  • Redis中的string对象是根据Redis的功能专门设计的,没有直接使用C字符串。SDS会被用作字符串对象的底层实现。SDS定义如下。

    clipboard.png

  • 这样设计有什么好处呢?

    1. 比C字符串更快获取长度
    2. C字符串在拼接的时候可能出现缓冲区溢出的问题,而SDS结构的API会检查free字段的值,看是否需要扩展缓冲区。这就避免了缓冲区溢出问题
    3. Redis作为数据库,在设计的时候,一定是假设数据会被经常访问和修改。那C字符串在append和trim的过程中会触发内存重分配。添加length和free字段可以有效减少内存重分配的压力。Redis有一套机制。总的来说就是append的时候预留空间,trim的时候不急着归还内存,以备不时之需。具体的数值自行查阅原文或其他相关资料。
    4. 在保存图像,音频等二进制数据的时候,C字符串只能胜任保存文本数据,SDS会以处理二进制的方式处理buf数组的数据。例如,SDS使用len属性判断字符串是否结束,而不是空字符串。
    5. 此外SDS还被设计成兼容部分C字符串的函数,避免了重复造轮子。

2.链表

  • C语言没有内置链表,Redis在开发的过程中构建了自己的链表实现。此处的链表跟数据结构课上讲到的链表无太大区别。Node定义如下。

    clipboard.png

  • NodeList 定义如下。

    clipboard.png

  • 相对应的,Redis的设计者们给链表设计了丰富的API。
  • 链表在Redis中的实际应用:列表键,发布和订阅,慢查询,监视器等

Mandelbrot_Kobe
93 声望25 粉丝

golang