关于redis与db不一致问题的思考总结

  1. 腾讯之前一直深挖这一部分,让我有幸深入思考了一部分,今天记起来这儿,做一点总结,感谢腾讯的压力让我深入理解
  2. 关于不一致的问题:
    1. 一般情况下,我们都是先同步数据库,然后再删除redis,当删除redis时出问题了,这样就会出现不一致问题
    2. 于是,我们可以先删除缓存,再同步到数据库。这样,保证下次访问时候,先访问redis,没有数据,则请求DB,保证了Redis与DB的一致。当出错了,至少不会出现超卖现象,但是用户体验感很差
    3. 这样做会出现问题,那就是下一次访问,DB还没更新完成,Redis请求到没有更新的DB,这样Redis依旧会存储的旧数据。
    4. 于是可以引入双删,写之前删除redis一次,db写入完后再删除一次redis,但这样的操作代价较高
    5. 于是,可以在redis中引入队列,队列的容量与商品容量一致,同时将后续的读请求压入队列中,满则不再允许再进入请求,这样对队列一个个处理,可以防止超卖问题,解决了数据不一致问题
    6. 但是这样会出现问题,许多读请求放入队列,大量的请求会导致队列溢出,这样会给缓存带来压力,于是可以在redis缓存队列中做请求去重,如果一致的请求,队列中存放一个请求任务。
    7. 为了防止一个用户拍多件商品,应该引入一个用户id集合在redis中,去除同一用户的多抢购问题。
    8. 针对用户体验感问题,只要用户任务入队,则返回成功提示,剩下的订单更新任务则继续执行。
    9. 对于队列中的任务,我们可以使用多线程进行处理,使用线程池加同步锁加快处理。
  3. 如何再进行优化系统?个人理解如下
    1. 在应对大流量问题上,首先在硬件方面,申请足够的带宽,并使用集群进行应对,
    2. 在redis前进行过滤或者校验,防止恶意重复ip攻击,造成缓存穿透或者击穿,并配置过期策略
    3. 通过定时同步的方法,解决缓存更新和失效问题,也可以做预热处理
    4. 使用nginx进行负载,把请求均匀分发到每个Tomcat中
    5. 使用分表技术,并对大流量进行一定的限流
    6. 前端优化使用CDN技术
  4. 以上是个人的一些理解,如有问题,恳请指正
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

l8947943

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值