Question & Answer

1. 什么是 cache aside 模式

Cache aside 可能是最常用的缓存方法。此策略规定缓存必须位于一侧,并且应用程序将直接与缓存和数据库通信。
Cache aside通常是通用的,最适合读取密集型工作负载。

缓存流程

查询策略
+---------------------+
|    查询缓存数据     |
+---------------------+
           |
           v
+---------------------+
|  缓存命中?(是/否)  |
+---------------------+
      |       |
      |是     |否
      v       v
+---------+ +---------------------+
| 返回数据 | |   查询数据库        |
+---------+ +---------------------+
                          |
                          v
             +---------------------+
             |   将数据写入缓存     |
             +---------------------+
                          |
                          v
             +---------------------+
             |     返回数据        |
             +---------------------+

更新策略
+---------------------+
|   数据更新请求       |
+---------------------+
           |
           v
+---------------------+
|   更新数据库         |
+---------------------+
           |
           v
+---------------------+
|   删除缓存或使之失效 |
+---------------------+

2. 使用 cache aside 模式需要注意的问题

  • 此策略的缺点:在缓存未命中后需要三次网络往返。
  • 数据一致性,数据更新时,可能出现缓存和数据库不一致的短暂情况。
  • 如果缓存容量有限,可能会因缓存驱逐策略(如 LRU)导致数据被提前移除。
  • 缓存击穿,如果采用删除缓存的方案,在高并发场景下可能会导致缓存击穿。
  • 缓存雪崩,大量缓存同时失效时,可能导致大量请求直接打到数据库。
  • 缓存穿透,当查询的 key 在数据库中不存在,且未缓存时,可能导致对数据库的重复查询。

参考