缓存异常——如何解决缓存和数据库的数据不一致问题?
缓存和数据库的一致性问题是需要得到保证的,应用从缓存中读取的必须是最新数据,不然就会产生严重的错误,那么我们先看看缓存与数据库之间的不一致是如何产生的?
缓存与数据库的不一致是如何产生?
数据的一致性主要分为两种情况:
- 缓存中有数据,缓存中的数据必须与数据库中的值一致;
- 缓存中没有数据,数据库中的值必须是最新值;
缓存根据时都接收写请求分为读写缓存和只读缓存,读写缓存就是对数据进行增删改,需要在缓存中进行,还要根据采取的写回策略决定是否同步写回到数据库中;
- 同步直写策略:写缓存时,也同步写数据库,缓存与数据中的数据一致;
- 异步写回策略:写缓存时不同步写数据库,等到数据从缓存中淘汰时,在写回数据,会出现的问题就是数据还没写回数据库,缓存发生故障,此时数据库也就没有最新的数据。
对于读写缓存,需要采用同步直写的策略来同时更新缓存和数据库,需要在业务应用中采用事务机制来保证缓存和数据库的更新具有原子性,两者要不一起更新,要不都不更新返回错误信息,进行重试。
对于数据一致性要求性不高的场景下,例如商品中的非关键属性等可以采用异步写回策略。
只读缓存
当数据新增数据时直接写入数据库,当数据删改时需要将只读缓存中的数据标记为无效,当应用后续在访问这些增删改的数据时,