先更新了缓存,然后数据库也更新了,但是数据库更新失败了,回滚之后就会出现缓存不一致的情况。
或者两个线程更新同一个数据的时候,但是时序不一样,可能存在缓存不一致的问题。
避免这种情况就是删除缓存;
但是后删缓存仍然存在缓存不一致的情况,当A请求做查询操作,B请求做更新操作,
A先读取,但是缓存刚好失效,读取到数据库旧值,
B将新值写入到数据库,B将缓存删除
此时A将旧值更新到缓存中,此时某些读取改数据的线程就可能读取到旧值
然后B在将数据更新到缓存,
在A更新缓存和B更新缓存之间,可能会存在有一些线程读取到旧值(脏数据)。
但是!删除缓存可能会失败,那就把失败的key写进消息队列中,重新从消息队列获取数据,再次删除缓存。