面试题答案
一键面试先更新数据库再更新缓存
- 优点:逻辑相对简单,数据的读写操作都基于最新的数据,理论上可以保证缓存与数据库数据的一致性。
- 缺点:在高并发场景下,并发写操作可能导致缓存数据不一致。比如线程A更新数据库后,还未来得及更新缓存,线程B又更新了数据库,然后线程A更新缓存,此时缓存中的数据就不是最新的数据库数据。
先删除缓存再更新数据库
- 优点:在并发写操作时,先删除缓存,后续读操作会从数据库加载最新数据并写入缓存,理论上能保证数据最终一致性。
- 缺点:存在数据不一致窗口。例如,在删除缓存后,更新数据库前,有读请求进来,此时会从数据库读到旧数据并写入缓存,导致缓存数据错误。在高并发读写场景下,这个窗口期间可能会有大量的读请求读到旧数据。
先更新数据库再删除缓存
- 优点:相比先删除缓存再更新数据库,减少了数据不一致窗口的影响。因为先更新数据库,即使在删除缓存前有读请求,读到的也是数据库的最新数据,后续删除缓存后,再次读时会从数据库加载最新数据到缓存。
- 缺点:也存在极小概率的不一致情况,例如删除缓存失败,导致缓存数据一直是旧数据。不过这种情况可以通过重试机制等手段来降低影响。
在高并发读写场景下相对更优策略及原因
在高并发读写场景下,先更新数据库再删除缓存策略相对更优。原因如下:
- 它能在一定程度上减少数据不一致的时间窗口,在大部分情况下能保证读操作读到的是最新数据。
- 对于删除缓存失败的情况,可以通过添加重试机制或者使用消息队列等方式来确保缓存最终被删除,从而保证数据一致性。而先更新数据库再更新缓存策略在高并发写时易出现缓存数据不一致;先删除缓存再更新数据库策略的数据不一致窗口在高并发读写时影响较大。