简介
基础篇强调构建系统观,重在让读者对 Redis 的总体架构和关键模块有一个全局的认知,然后再深入到具体的技术。本章是基础篇的第一篇。第一篇从 SimpleKV 这个虚构的 kv 数据库开始讲解,通过逐步推演构造 SimpleKV 来构建知识框架。
关键问题
- 掌握数据模型和操作接口
前者突出可以存什么数据,后者突出可以对数据作什么操作。
数据模型:key 往往大同小异,重点在于 value 类型支持。Memcached 仅支持 String. Redis 支持的 value 类型包括 String、哈希表、列表、集合等。Redis 受欢迎的一个重要原因就在于支持丰富的 value 类型。
数据操作,最基本的:
- Put:插入/更新
- Get:获取指定 key 对应的 value
- Delete: 删除指定键值
- Scan:根据指定 key 范围返回 value 列表
-
键值对保存在内存还是外村
Memcache/ Redis 都是内存型。SimpleKV 也采用内存型。外存会更复杂。 -
采用什么访问模式
- 函数库调用的方式供外部使用:比如动态链接库的方式
- 通过网络框架以 socket 通信的方式访问
-
如何定位键值对的位置
索引的作用是让键值数据库根据 key 找到相应 value 的存储位置,进而执行操作。索引类型有哈希表、B+ 树、字典树等,Memcache 和 Redis 均采用哈希表,SimpleKV 也如此。哈希表复杂度 O(1 ),内存的高性能随机访问特性和哈希表很匹配。 -
不同操作的具体逻辑是怎样的
- Get/Scan:根据索引找到 value 存储位置,返回 value 值即可。
- Put: 为一个新的键值对分配内存空间,并进行设置
- Delete:删除键值对,并释放相应的空间,这个过程由分配器完成。
- 如何实现重启后快速提供服务?
「SimpleKV 采用了常用的内存分配器 glibc 的 malloc 和 free,因此,SimpleKV 并不需要特别考虑内存空间的管理问题。但是,键值数据库的键值对通常大小不一,glibc 的分配器在处理随机的大小内存块分配时,表现并不好。一旦保存的键值对数据规模过大,就可能会造成较严重的内存碎片问题。」
分配器是内存数据库的一个关键因素。Redis 的内存分配器提供了多种选择。为重启后快速提供服务,KV 数据库也要有持久化功能。SimpleKV 采用文件存储方式。
实现上,有两种方式:
- 每次操作都要罗盘,数据可靠性高,但频繁写盘性能差
- 周期性的写文件罗盘,性能高,但可能丢数据
KV 数据库的基本结构
![](https://img.haomeiwen.com/i4305732/bc37d49975b7e79c.png)
通过 SimpleKV 这么一个麻雀虽小五脏俱全的数据库,学习内存 KV 的基本组件,便于进一步学习 Redis.
![](https://img.haomeiwen.com/i4305732/3c69e51077abb95e.png)
SimpleKV 和 Redis 的几个关键差异:
- Redis 通过网络框架访问,而不是动态库
- Redis 提供更加丰富的数据类型
- Redis 提供更完善的持久化能力,包含日志 AOF、快照 RDB 两种方式。
- Redis 提供集群能力,支持高可靠、高可扩展集群能力
网友评论