参考:
https://time.geekbang.org/column/article/268262
系统观
我们通过剖析这个最简单的键值数据库SimpleKV,来迅速抓住学习和调优 Redis 的关键。
重点:数据模型 和 操作接口
可以存哪些数据?(数据模型)
对于键值数据库而言,基本的数据模型是 key-value 模型。
key类型一般差异不大,value类型有较大差别
Redis支持的类型包括String、哈希表、列表、集合等。
可以对数据做什么操作?(操作接口)
PUT/GET/DELETE/SCAN 是一个键值数据库的基本操作集合
PUT:新写入或更新一个 key-value 对;(有些键值数据库的新写 / 更新操作叫 SET)
GET:根据一个 key 读取相应的 value 值;
DELETE:根据一个 key 删除整个 key-value 对。
SCAN:查询一个用户在一段时间内的访问记录,根据一段 key 的范围返回相应的 value 值。
键值对保存在内存还是外存?
如何进行设计选择,我们通常需要考虑键值数据库的主要应用场景
为了和 Redis 保持一致,我们的 SimpleKV 就采用内存保存键值数据。
SimpleKV基本组件
SimpleKV基本组件:一个键值数据库包括了访问框架、索引模块、操作模块和存储模块四部分
采用什么访问模式?(访问框架)
访问模式通常有两种:
一种是通过函数库调用的方式供外部应用使用,
另一种是通过网络框架以 Socket 通信的形式对外提供键值对操作
如何定位键值对的位置?(索引模块)
索引的作用是让键值数据库根据 key 找到相应 value 的存储位置,进而执行操作。
内存键值数据库(例如 Redis)采用哈希表作为索引
不同操作的具体逻辑是怎样的?(操作模块)
对于 GET/SCAN 操作而言,此时根据 value 的存储位置返回 value 值即可;
对于 PUT 一个新的键值对数据而言,SimpleKV 需要为该键值对分配内存空间;
对于 DELETE 操作,SimpleKV 需要删除键值对,并释放相应的内存空间,这个过程由分配器完成。
如何实现重启后快速提供服务?(存储模块)
SimpleKV 的存储模块中增加了持久化功能
鉴于磁盘管理要比内存管理复杂,SimpleKV 就直接采用了文件形式,将键值数据通过调用本地文件系统的操作接口保存在磁盘上。,SimpleKV 只需要考虑何时将内存中的键值数据保存到文件中,就可以了
小结
-
Redis 主要通过网络框架进行访问,而不再是动态库了,这也使得 Redis 可以作为一个基础性的网络服务进行访问,扩大了 Redis
的应用范围。 -
Redis 数据模型中的 value 类型很丰富,因此也带来了更多的操作接口,例如面向列表的 LPUSH/LPOP,面向集合的 SADD/SREM 等。在下节课,我将和你聊聊这些 value 模型背后的数据结构和操作效率,以及它们对 Redis 性能的影响。
-
Redis 的持久化模块能支持两种方式:日志(AOF)和快照(RDB),这两种持久化方式具有不同的优劣势,影响到 Redis 的访问性能和可靠性。
-
SimpleKV 是个简单的单机键值数据库,但是,Redis 支持高可靠集群和高可扩展集群,因此,Redis 中包含了相应的集群功能支撑模块。