概述
- 当前修改或者保存,删除数据库数据之后,Redis中的数据也应该进行相应的变化。不然再次查询可能查询出已经删除的脏数据
- 无论是先写到缓存还是先写到数据库,这两部操作不能保证原子性,所以会出现数据不一致性问题
- 先删除缓存,在修改数据库,如果修改失败了,数据库中依旧是旧数据,缓存中是空的,读的时候缓存中没有,数据库中有,更新到缓存中。数据发生了变更,先删除缓存,然后要去修改数据库,此时,另一个线程请求进来,去读缓存,发现缓存空了,去查数据库,发现了旧数据,更新到缓存中,随后数据库变更操作完成了更新,这样数据库和缓存就不一致了
如何解决
- 延时双删:先淘汰缓存,在写数据库,休眠一秒再次淘汰缓存
- 线程A删除缓存
- 线程B查询缓存发现为空
- 线程B查询DB并写入缓存
- 线程A更新数据库
- 延时一秒线程A在删除缓存
- 串行化