# TiKV 数据读取流程 (A)

![`left`](./student-guide/diagram/08-Data-reading-process-01-01.png)
-------------------------------------------------------------
- TiKV Server 收到 gRPC 请求之后，Unified Read Pool 会根据优先级以及执行时长的不同被放到不同的任务队列中：
  - 如果是 KV Get  点查询， 收到这个请求后会做如下操作
    - 从 RocksDB 获取一个 Snapshot
    - 基于 Snapshot 使用 Point-lookup 获取相应的 key-value，Point-lookup 数据读取流程如下：
      -  RocksDB 中有 Block Cache 在内存中缓存数据，则直接命中并返回
      - 如果 Block Cache  没有命中那么：
        - 从 L0 向下遍历每一层文件直到找到对应的 key-value：
        - 从 memtable 从查找，如果没有找到，则从 SST 文件中查找
        - 二分查找包含这个 key 的文件（每一个文件包含一个 key 的范围，如果目标 key 没有在这个范围之中，则跳过这个文件，另外 L0 的文件是可能重叠的，需要查 L0 的所有文件）
        - 检查 Bloom filter (Bloom Filters by Example)，这个文件是否包含这个 key（前一步骤中是判断 key 是否可能位于这个文件是根据文件的范围，比如 A 文件的范围是 [1, 10)，这个时候如果 key 是 11，那么直接跳过这个文件，如果 key 是 5，则这个文件可能包含这个返回；本步骤通过 bloom filter 判断是否包含这个 key，能通过前一步骤说明这个 key 位于这个范围，这一步检查是否这个文件包含这个 key，比如 A 的范围是 [1, 10)，里面的 key 有 (1,3,5,7,9)，这个时候 6 虽然落在范围 [1, 10)，但是并没有包含在这个文件）
