redis面试题目-如何保证数据库与缓存的数据一致性

原视频:https://www.bilibili.com/video/BV1Km4y1r75f?p=62&vd_source=fa75329ae3880aa55609265a0e9f5d34

由于缓存和数据库是分开的,无法做到原子性的同时进行数据修改,可能出现缓存更新失败,或者数据库更新失败的情况,这时候会出现数据不一致,影响前端业务

  • 先更新数据库,再更新缓存。缓存可能更新失败,读到老数据
  • 先删缓存,再更新数据库。并发时,读操作可能还是会将旧数据读回缓存.先更新数据库,再删缓存。也存在缓存删除失败的可能
    最经典的缓存+数据库读写模式- Cache Aside Pattern :
    读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。更新的时候,先更新数据库,然后再删除缓存。

为什么是删除缓存而不是更新缓存?
因为删除更加轻量,时延迟加载的一种实现,更新可能涉及多个表、比较耗时

更优的方案:延时双删:
先删除缓存,再更新数据库,休眠1s、再次删除缓存。写数据的休眠时间则在读数据业务逻辑的耗时基础上,加几百 ms 即可。这么做的目的,就是确保读请求结束,写请求可以删除读请求造成的缓存脏数据,并发还是可能读到旧值覆盖缓存

终极方案:
将访问操作串行化
1.先删除缓存,将更新操作放入一个有序队列中
2.从缓存查不到的查询操作,都进入有序队列
会面临的问题:
1、读请求挤压,大量超市,导致数据库的压力
2. 如何避免大量请求挤压:将队列水平拆分,提高并行度,不同的业务使用不同的队列
3. 保证相同请求路由正确

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值