先更新数据库还是先更新缓存?

129 阅读2分钟

先更新数据库还是先更新缓存?

应用缓存之后,缓存和数据库何时更新?
数据不一致的情况(数据库和缓存双写一致性):
数据库和缓存层是不同的系统,数据更新的时候,理想情况应该是缓存和数据库同时更新成功。
但是由于数据库和缓存层是分开的,无法做到原子性的同时进行数据修改,
可能会出现数据库或缓存层更新失败,出现数据不一致的情况

先更新数据库,再更新缓存
高并发场景,读A,写BB先更新数据库 udb;随后A读了缓存,rcache,缓存此刻还没更新返回了错误数据;此刻B更新了缓存ucache

先删缓存,在更新数据库
(1)写请求删除缓存数据;
(2)读请求查询缓存未击中(Hit Miss),紧接着查询数据库,将返回的数据回写到缓存中;
(3)写请求更新数据库。

先更新数据库,再删缓存 也会出现风险

为什么删除缓存,而不是更新缓存?删除更轻量级,出问题的几率更小。从计算资源和性能考虑更新的时候删除,等下次查询命中再填充缓存
    
缓存读多写少,更新数据库和缓存应该串行化,加锁操作。

那么多级缓存如何更新?
(1)通过消息队列通知的方式,数据库更新后,通过事务性消息队列加监听的方式,失效该缓存
(2)具体业务可以具体考虑,如给数据添加版本号,或者通过时间戳 + 业务主键的方式,控制缓存的数据版本实现最终一致性。
扩展 CAP原则:
- CAP是在一个分布式系统中,Consitency(一致性)、Availability(可用性)、Partition tolerance(分区容错性)。
- AP 无主+数据同步 满足可用性,在网络出现异常的情况,系统仍可工作,
    但会出现节点数据不一致但情况。如eureka,允许短暂数据不一致。用户体验(舍弃一致性)。
    数据同步 P 节点之前对称,节点角色均等,对称式架构,各个节点需要互相通信,保证数据一致性,节点通信会指数型增长。
- CP raft协议 选主+数据同步,保证线程安全。数据同步 P 非对称,有专门的leader维护元数据。如zk