建立“系统观”,对总体架构和关键模块有一个全局的认知。然后再深入具体技术点。
笔记:
- Redis 能够在实际业务中得到广泛的应用,得益于支持多样化类型的 value;
- 常见操作 PUT、GET、DELETE;SCAN 获取一段 key 的范围值
- 存在内存,一般 百 ns 访问级别,风险:掉电数据丢失;
- 存在外存,避免数据丢失,受限慢速读写 ms 级别;
设计 SimpleKV
一个简直数据库包括:访问框架、索引模块、操作模块、存储模块;
采用什么访问方式?
- 动态库访问 libsimplekv.so
- Socket Server + 请求解析(Redis / Memcached 都是这种)
- 衍生问题 I/O 模型设计,不同的设计对性能和可扩展性有影响
- 单线程问题:阻塞
- 多线程问题:共享资源竞争
- Reis 单线程,高性能
如何定位键值对的位置?
索引的作用是让键值数据库根据 key 找到对应 value 的存储位置,进而执行操作。
Redis 和 Memcached 都是使用哈希表[O(1)]作为索引的。
不同操作的具体逻辑是怎样的?
- 对于 GET/SCAN 直接返回 value;
- 对于 PUT 为其分配新的内存空间;
- 对于 DELETE 删除并释放内存空间(内存分配器完成)
重启后快速提供服务?
方案一:对每一个键值都罗盘,可靠但性能受损
方案二:周期性内存刷盘,性能保障但数据安全有风险