第一部分 数据结构与对象
- Redis是键值数据库。键通常是字符串对象,值有五种可能的对象:字符串,列表,哈希,集合,有序集合。第一部分是介绍这五种对象,剖析其底层数据结构,以及该数据结构对其功能和性能的影响
- Redis是由C语言编写,所以出现的源码皆为C语言,其他语言会另外声明。
1. 简单动态字符串(simple dynamic string,SDS)
- Redis中的string对象是根据Redis的功能专门设计的,没有直接使用C字符串。SDS会被用作字符串对象的底层实现。SDS定义如下。
-
这样设计有什么好处呢?
- 比C字符串更快获取长度
- C字符串在拼接的时候可能出现缓冲区溢出的问题,而SDS结构的API会检查free字段的值,看是否需要扩展缓冲区。这就避免了缓冲区溢出问题
- Redis作为数据库,在设计的时候,一定是假设数据会被经常访问和修改。那C字符串在append和trim的过程中会触发内存重分配。添加length和free字段可以有效减少内存重分配的压力。Redis有一套机制。总的来说就是append的时候预留空间,trim的时候不急着归还内存,以备不时之需。具体的数值自行查阅原文或其他相关资料。
- 在保存图像,音频等二进制数据的时候,C字符串只能胜任保存文本数据,SDS会以处理二进制的方式处理buf数组的数据。例如,SDS使用len属性判断字符串是否结束,而不是空字符串。
- 此外SDS还被设计成兼容部分C字符串的函数,避免了重复造轮子。
2.链表
- C语言没有内置链表,Redis在开发的过程中构建了自己的链表实现。此处的链表跟数据结构课上讲到的链表无太大区别。Node定义如下。
- NodeList 定义如下。
- 相对应的,Redis的设计者们给链表设计了丰富的API。
- 链表在Redis中的实际应用:列表键,发布和订阅,慢查询,监视器等
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。