如何查找键值对

Redis 网络访问模块解析客户端的请求,获得要执行的操作,针对键值对的操作就先要查找键值对是否存在。这就要用到 Redis 的索引模块。在索引模块,Redis 根据 key 查找到 value 的存储位置

常见的索引有哈希表 (hash),B+ 树,字典树等。不同的索引性能、内存空间、并发控制等都有不同。不同键值数据库用的索引不相同,Memcached 和 Redis 的键值对的索引是哈希表 (hash),RocksDB 键值对索引是跳表(skip-list)

Redis 采用哈希表作为索引,因为它的键值数据保存在内存中,内存中随机访问性能很高,和哈希表随机访问 O(1) 时间复杂度匹配。

Redis 中查找 key 对应的 value 分为两步,

  1. 按照哈希表索引找到 key 对应的 value 的存储位置
  2. value 有多种类型(集合 / 列表),还要在 value 中查找实际需要的数据

不同操作的具体逻辑

索引模块查找到 key 对应的 value 存储位置后,Redis 的操作模块按照不同的操作命令执行不同的逻辑

  • GET/SCAN,查找 value,找到 value 位置返回 value 的值
  • PUT,新增一个键值对,Redis 为该键值对分配内存空间
  • DELETE,Redis 删除键值对,释放相应的内存空间

PUT 和 DELETE 操作中除了写入和删除键值对,还要分配和释放内存,这就依赖 Redis 的存储模块的内存分配器。 键值数据库的键值对大小不一,一旦保存的键值对数据规模过大,可能会造成严重内存碎片问题。 对于 Redis 这样的内存键值数据库,内存分配器尤为重要。不同的内存分配器分配效率不一样。

持久化

Redis 的持久化是把键值对通过调用本地文件系统操作接口保存到磁盘,重启后快速重新提供服务。持久化有两种方式

  1. 对操作的每个键值对都进行保存,保证了数据的可靠,但是每次操作都要写入磁盘,降低性能
  2. 定时把键值数据保存到文件,避免频繁写入的性能问题,但是数据还是有丢失风险

对比 simpleKV 和 Redis

  1. Redis 作为一个基础网络服务,给客户端提供网络框架进行访问,扩大 Redis 应用范围
  2. Redis 中的 value 数据类型丰富,提供多种操作接口
  3. Redis 不同的持久化方式 AOF 和 RDB,它们有不同的优劣势,影响 Redis 的访问性能和可靠性
  4. Redis 支持高可靠集群和可扩展集群

总结

通过学习 SimpleKV,我们对键值数据库的基本结构和重要模块有了整体认知和深刻理解,这是 Redis 单机版的核心基础。