当查询频率大于修改频率,就需要使用缓存技术。先请求redis,redis存在就返回缓存数据,redis不存在就查询数据库,返回数据的同时将数据库缓存到reids中。

数据一致性情况:

  1. 缓存有数据,那么缓存的值和数据库中的值相同。
  2. 缓存没有数据,那么数据库中的值必须是最新值。

问题:

数据库或缓存更新,导致缓存和数据库数据库数据不一致问题。

原因:

在高并发的情况下,不管是先写数据库,再删缓存;还是先删缓存,再写数据库。都有可能出现数据不一致的情况。

  1. 如果删除了缓存redis,还没来得及写数据库,此时另外一个线程就读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中的数据为 脏数据。
  2. 如果写了数据库,在删除缓存前,写库的线程宕机了,也会出现数据不一致的情况。

解决方法(延迟双删策略):

  1. 先删除缓存
  2. 再写数据库
  3. 休眠500ms(休眠的作用是当前线程等其他线程读完了数据后写入缓存后,删除缓存)
  4. 再删除缓存

 

 posted on 2022-06-22 15:27  会飞的金鱼  阅读(477)  评论(0)    收藏  举报