“两大维度”就是指系统维度和应用维度,“三大主线”也就是指高性能、高可靠和高可扩展(可以简称为“三高”)。
首先,从系统维度上说,你需要了解 Redis 的各项关键技术的设计原理,这些能够为你判断和推理问题打下坚实的基础,而且,你还能从中掌握一些优雅的系统设计规范,例如 run-to-complete 模型、epoll 网络模型,这些可以应用到你后续的系统开发实践中。
高性能主线,包括线程模型、数据结构、持久化、网络框架;
- 高可靠主线,包括主从复制、哨兵机制;
- 高可扩展主线,包括数据分片、负载均衡
在应用维度上,我建议你按照两种方式学习: “应用场景驱动”和“典型案例驱动”,一个是“面”的梳理,一个是“点”的掌握
如果我们想要深入理解和优化 Redis,就必须要对它的总体架构和关键模块有一个全局的认知,然后再深入到具体的技术点
对于键值数据库而言,基本的数据模型是 key-value 模型
在 SimpleKV 中,key 是 String 类型,而 value 是基本数据类型,例如 String、整型等
我们在对键值数据库进行选型时,一个重要的考虑因素是它支持的 value 类型。例如,Memcached 支持的 value 类型仅为 String 类型,而 Redis 支持的 value 类型包括了 String、哈希表、列表、集合等。
从使用的角度来说,不同 value 类型的实现,不仅可以支撑不同业务的数据需求,而且也隐含着不同数据结构在性能、空间效率等方面的差异,从而导致不同的 value 操作之间存在着差异
PUT:新写入或更新一个 key-value 对;
- GET:根据一个 key 读取相应的 value 值;
- DELETE:根据一个 key 删除整个 key-value 对
有些键值数据库的新写 / 更新操作叫 SET。新写入和更新虽然是用一个操作接口,但在实际执行时,会根据 key 是否存在而执行相应的新写或更新流程。
查询一个用户在一段时间内的访问记录
因此,PUT/GET/DELETE/SCAN 是一个键值数据库的基本操作集合
可以增加 EXISTS 操作接口,用于判断某个 key 是否存在
键值对保存在内存还是外存?
内存 好处是读写很快,毕竟内存的访问速度一般都在百 ns 级别, 潜在的风险是一旦掉电,所有的数据都会丢失
外存 可以避免数据丢失,受限于磁盘的慢速读写(通常在几 ms 级别),键值数据库的整体性能会被拉低
需要考虑键值数据库的主要应用场景。缓存场景下的数据需要能快速访问但允许丢失,那么,用于此场景的键值数据库通常采用内存保存键值数据