原视频:https://www.bilibili.com/video/BV1Km4y1r75f?p=62&vd_source=fa75329ae3880aa55609265a0e9f5d34
由于缓存和数据库是分开的,无法做到原子性的同时进行数据修改,可能出现缓存更新失败,或者数据库更新失败的情况,这时候会出现数据不一致,影响前端业务
- 先更新数据库,再更新缓存。缓存可能更新失败,读到老数据
- 先删缓存,再更新数据库。并发时,读操作可能还是会将旧数据读回缓存.先更新数据库,再删缓存。也存在缓存删除失败的可能
最经典的缓存+数据库读写模式- Cache Aside Pattern :
读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。更新的时候,先更新数据库,然后再删除缓存。
为什么是删除缓存而不是更新缓存?
因为删除更加轻量,时延迟加载的一种实现,更新可能涉及多个表、比较耗时
更优的方案:延时双删:
先删除缓存,再更新数据库,休眠1s、再次删除缓存。写数据的休眠时间则在读数据业务逻辑的耗时基础上,加几百 ms 即可。这么做的目的,就是确保读请求结束,写请求可以删除读请求造成的缓存脏数据,并发还是可能读到旧值覆盖缓存
终极方案:
将访问操作串行化
1.先删除缓存,将更新操作放入一个有序队列中
2.从缓存查不到的查询操作,都进入有序队列
会面临的问题:
1、读请求挤压,大量超市,导致数据库的压力
2. 如何避免大量请求挤压:将队列水平拆分,提高并行度,不同的业务使用不同的队列
3. 保证相同请求路由正确文章来源:https://www.toymoban.com/news/detail-448531.html
redis实战课:
https://www.bilibili.com/video/BV1cr4y1671t/?spm_id_from=333.999.0.0&vd_source=fa75329ae3880aa55609265a0e9f5d34
http://yun.itheima.com/course/806.html?capid=2文章来源地址https://www.toymoban.com/news/detail-448531.html
到了这里,关于redis面试题目-如何保证数据库与缓存的数据一致性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!