28.【实战】在库存服务中实现缓存与数据库双写一致性保障方案

本文介绍了如何在库存服务中确保缓存与数据库双写一致性。通过线程池+内存队列初始化,请求对象封装,异步执行Service和控制器接口优化等步骤,解决读写请求并发问题,防止缓存丢失导致的数据不一致。同时,讨论了代码优化,避免潜在漏洞,如去重逻辑和Redis缓存丢失的处理。
摘要由CSDN通过智能技术生成

项目框架

库存服务框架:spring boot+mybatis+jedis
学习项目地址: https://gitee.com/ddebug/eshop-study

根据下面开发步骤切换不同分支

在这里插入图片描述

整体流程

  1. 更新数据的时候,根据数据的唯一标识,将操作路由之后,发送到一个jvm内部队列
  2. 读取数据的时候,如果发现数据不在缓存中,那么将重新读取数据+更新缓存的操作,根据唯一标识路由之后,也发送同一个jvm内部的队列中
  3. 一个队列对应一个工作线程
  4. 每个工作线程串行拿到对应的操作,然后一条一条的执行
  5. 一个数据变更的操作,先执行删除缓存,然后再去更新数据库,但是还没完成更新,此时如果一个读请求过来,就会读到空的缓存,
  6. 可以先将缓存更新的请求发送到队列中,此时会在队列中积压,然后同步等待缓存更新完成

这里有一个优化点,一个队列中,其实多个读请求更新缓存串在一起是没意义的,因此可以做过滤,如果发现队列中已经有一个更新缓存的请求了,那么就不用再放个更新请求操作进去了,直接等待前面的更新操作请求完成即可

  1. 等内存队列对应的工作线程完成了上一个操作的数据库的修改之后,才会去执行下一个操作,也就是缓存更新的操作,此时会从数据库中读取最新的值,然后写入缓存中
  2. 如果请求还在等待时间范围内,不断轮询发现可以取到值了,那么就直接返回; 如果请求等待的时间超过一定时长比如200ms,那么这一次直接从数据库中读取当前的旧值

开发实战

1. 线程池+内存队列初始化

  1. java web应用,做系统的初始化,一般在ServletContextListener
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值