01 基本架构
1112字约4分钟
2024-12-18
概念
Redis是键值数据库
学习方法
先建立 系统观 ,想要深入理解和优化 Redis,就必须对它的 总体架构 和 关键模块 有一个全局的认知,然后再深入到具体的技术点。
构建一个简单的键值数据库 SimpleKV
构建一个具有关键组件的键值数据库 SimpleKV,需要考虑 具备什么机制(能力)、基本组件。
应具备什么机制(能力)?
可以存哪些数据(数据模型)?
可以对数据做什么操作(操作接口)?
数据存储在哪里(存储位置)?
数据模型
实现 key-value 模型
Memcached 支持的 value 类型仅为 String 类型。
Redis 支持多样的 value 类型,包括了 String、哈希表、列表、集合等。
操作接口
实现增删改查操作接口,如下:
- PUT:新写入或更新一个 key-value 对;(需要分配和释放内存)
- GET:根据一个 key 读取相应的 value 值;
- DELETE:根据一个 key 删除整个 key-value 对;(需要分配和释放内存)
- SCAN:查询一个 key 在相应条件内的数据;
具体逻辑:
对于 GET/SCAN 操作而言,此时根据 value 的存储位置返回 value 值即可;
对于 PUT 一个新的键值对数据而言,SimpleKV 需要为该键值对分配内存空间;
对于 DELETE 操作,SimpleKV 需要删除键值对,并释放相应的内存空间,这个过程由分配器完成。
存储位置
内存
保存在内存:读写速度快(百ns),一旦掉电所有的数据都会丢失。
保存在外存:读写速度慢(几ms)可以避免数据丢失。
应具备什么基本组件?
一个键值数据库包括了 访问框架、索引模块、操作模块和存储模块 四部分。
访问模式
提供键值操作的访问模式有两种:
- 通过 函数库调用 的形式,比如上图的 libsimplekv.so,就是以动态链接库的形式链接到我们自己的程序中。
- 通过 网络框架以 Socket 通信 的形式,这种形式可以提供广泛的键值存储服务。
比如:
RocksDB 是动态链接库形式
Memcached 和 Redis 是网络框架形式
索引模块
索引模块的作用是 如何定位键值对的位置,如何根据 key 找到相应 value 的存储位置,进而执行操作。
索引的类型
索引的类型有很多,常见的有哈希表、B+树、字典树等,不同的索引结构在性能、空间消耗、并发控制等方面具有不同的特征,不同键值数据库采用的索引并不相同。
例如:
Memcached 和 Redis 采用哈希表作为 key-value 索引。
RocksDB 则采用跳表作为内存中 key-value 的索引。
如何实现重启后快速提供服务?
持久化功能
考虑到磁盘管理复杂,SimpleKV 就直接采用了文件形式,将键值数据通过调用本地文件系统的操作接口保存在磁盘上
两种方式:
- 对于每一个键值对,SimpleKV 都对其进行落盘保存;(性能影响大)
- 周期性地把内存中的键值数据保存到文件中;(性能影响小、有丢失风险)
小结
至此,构造了一个简单的键值数据库 SimpleKV。
SimpleKV和Redis的区别:
Redis 主要通过网络框架进行访问,而不再是动态库了,这也使得 Redis 可以作为一个基础性的网络服务进行访问,扩大了 Redis 的应用范围。
Redis 数据模型中的 value 类型很丰富,因此也带来了更多的操作接口,例如面向列表的 LPUSH/LPOP,面向集合的 SADD/SREM 等
Redis 的持久化模块能支持两种方式:日志(AOF)和快照(RDB),这两种持久化方式具有不同的优劣势,影响到 Redis 的访问性能和可靠性。
SimpleKV 是个简单的单机键值数据库,Redis 中包含了集群功能支撑模块,所以支持高可靠集群和高可扩展集群。