概述
- 腾讯之前一直深挖这一部分,让我有幸深入思考了一部分,今天记起来这儿,做一点总结,感谢腾讯的压力让我深入理解
- 关于不一致的问题:
- 一般情况下,我们都是先同步数据库,然后再删除redis,当删除redis时出问题了,这样就会出现不一致问题
- 于是,我们可以先删除缓存,再同步到数据库。这样,保证下次访问时候,先访问redis,没有数据,则请求DB,保证了Redis与DB的一致。当出错了,至少不会出现超卖现象,但是用户体验感很差
- 这样做会出现问题,那就是下一次访问,DB还没更新完成,Redis请求到没有更新的DB,这样Redis依旧会存储的旧数据。
- 于是可以引入双删,写之前删除redis一次,db写入完后再删除一次redis,但这样的操作代价较高
- 于是,可以在redis中引入队列,队列的容量与商品容量一致,同时将后续的读请求压入队列中,满则不再允许再进入请求,这样对队列一个个处理,可以防止超卖问题,解决了数据不一致问题
- 但是这样会出现问题,许多读请求放入队列,大量的请求会导致队列溢出,这样会给缓存带来压力,于是可以在redis缓存队列中做请求去重,如果一致的请求,队列中存放一个请求任务。
- 为了防止一个用户拍多件商品,应该引入一个用户id集合在redis中,去除同一用户的多抢购问题。
- 针对用户体验感问题,只要用户任务入队,则返回成功提示,剩下的订单更新任务则继续执行。
- 对于队列中的任务,我们可以使用多线程进行处理,使用线程池加同步锁加快处理。
- 如何再进行优化系统?个人理解如下
- 在应对大流量问题上,首先在硬件方面,申请足够的带宽,并使用集群进行应对,
- 在redis前进行过滤或者校验,防止恶意重复ip攻击,造成缓存穿透或者击穿,并配置过期策略
- 通过定时同步的方法,解决缓存更新和失效问题,也可以做预热处理
- 使用nginx进行负载,把请求均匀分发到每个Tomcat中
- 使用分表技术,并对大流量进行一定的限流
- 前端优化使用CDN技术
- 以上是个人的一些理解,如有问题,恳请指正
最后
以上就是独特毛豆为你收集整理的关于redis与db不一致问题的思考总结的全部内容,希望文章能够帮你解决关于redis与db不一致问题的思考总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复