这样的问题主要是在并发读写访问的时候,缓存和数据相互交叉执行。
一、单库情况下
同一时刻发生了并发读写请求,例如为A(写) B (读)2个请求
1. A请求发送一个写操作到服务端,第一步会淘汰cache,然后因为各种原因卡主了,不在执行后面业务 (例:大量的业务操作、调用其他服务处理消耗了1s)。
2. B请求发送一个读操作,读cache,因为cache淘汰,所以为空
3. B请求继续读DB,读出一个脏数据,并写入cache
4. A请求终于执行完全,在写入数据到DB
总结:因最后才把写操作数据入DB,并没同步。cache里面一直保持脏数据
脏数据是指源系统中的数据不在给定的范围内或对于实际业务毫无意义,或是数据格式非法,以及在源 系统中存在不规范的编码和含糊的业务逻辑。
二、主从同步,读写分离的情况下,读从库而产生脏数据
1. A请求发送一个写操作到服务端,第一步会淘汰cache
2. A请求写主数据库,写了最新的数据。
3. B请求发送一个读操作,读cache,因为cache淘汰,所以为空
4. B请求继续读DB,读的是从库,此时主从同步还没同步成功。读出脏数据,然后脏数据入cache
5. 最后数据库主从同步完成
总结:这种情况下请求A和请求B操作时序没问题,是主从同步的时延问题(假设1s),导致读请求读取从 库读到脏数据导致的数据不一致
根本原因:
单库下,逻辑处理中消耗1s,可能读到旧数据入缓存
主从+读写分离,在1s的主从同步时延中,到从库的旧数据入缓存