Redis 设计与实现

内容:

  • 字符串(string)、散列(hash)、列表(list)、集合(set)和有序集合(sorted set)五种类型的键的底层实现。
  • Redis 的对象处理机制以及数据库的实现原理。
  • 事务实现原理。
  • 订阅与发布实现原理。
  • Lua 脚本功能的实现原理。
  • SORT 命令的的实现原理。
  • BITOPBITCOUNT 等二进制位处理命令的实现原理。
  • 慢查询日志的实现原理。
  • RDB 持久化和 AOF 持久化的实现原理。
  • Redis 事件处理器的实现原理。
  • Redis 服务器和客户端的实现原理。
  • 复制(repication)、Sentinel 和集群(cluster)这三个多机功能的实现原理。

二、简单动态字符串

Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符串数组),而是自己构建了一种名为简单动态字符串(Simple Dynamic String,SDS)的抽象类型,并将 SDS 作为 Redis 的默认字符串表示。

1
2
3
4
5
6
7
8
9
10
11
struct sdshdr {
// 记录 buf 数组中已使用字节的数量
// 等于 SDS 所保存字符串的长度
int len;

// 记录 buf 数组中未使用字节的数量
int free;

// 字节数组,用于保存字符串
char buf[];
}

设计原因:

  • 获取字符串长度所需复杂度从 O(N) 降低到 O(1),确保获取字符串长度不会成为性能瓶颈。
  • 杜绝缓冲区溢出。(忘记分配足够内存时)
  • 减少修改字符串带来的内存重分配次数。(增长字符串需要扩展底层数组长度,相反需要释放空间)
    • xxxx