当查询频率大于修改频率,就需要使用缓存技术。先请求redis,redis存在就返回缓存数据,redis不存在就查询数据库,返回数据的同时将数据库缓存到reids中。
数据一致性情况:
- 缓存有数据,那么缓存的值和数据库中的值相同。
- 缓存没有数据,那么数据库中的值必须是最新值。
问题:
数据库或缓存更新,导致缓存和数据库数据库数据不一致问题。
原因:
在高并发的情况下,不管是先写数据库,再删缓存;还是先删缓存,再写数据库。都有可能出现数据不一致的情况。
- 如果删除了缓存redis,还没来得及写数据库,此时另外一个线程就读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中的数据为 脏数据。
- 如果写了数据库,在删除缓存前,写库的线程宕机了,也会出现数据不一致的情况。
解决方法(延迟双删策略):
- 先删除缓存
- 再写数据库
- 休眠500ms(休眠的作用是当前线程等其他线程读完了数据后写入缓存后,删除缓存)
- 再删除缓存
posted on
浙公网安备 33010602011771号