紧接着上一篇27.【实战】在库存服务中实现缓存与数据库双写一致性保障方案的业务代码,打印普通测试日志,观察功能是否实现。
日志代码
-
项目地址:eshop-study,切换到该分支,进行调试测试:
-
配置自己的
mysql
;
-
配置自己的
redis
集群地址;
测试流程
- 测试场景模拟:
* 1. 一个商品库存更新请求过来,先删除redis中的缓存,然后模拟卡顿5秒钟;
* 2. 在卡顿5s中,此时发送一个读请求,因为此时redis中没有缓存,应该读取数据库中罪行库存数据刷新到缓存中;
* 3. 此时读请求会路由到同一个内存队列中,阻塞住,不会执行;
* 4. 等5秒钟后,写请求完成了数据库的更新后,读请求才会执行;
* 5. 读请求执行的时候,会将最新的刚刚更新的库存从数据库中查询出来,然后更新到缓存中;
- 就是修改
更新库存请求
删除redis缓存后停顿的时间,紧接着一个读请求
是否在200ms内响应的两种操作;
- 更新库存请求:
- 读请求:
- 第一种:
200ms内没有读取到缓存
重新生成
强制刷新读请求
放到内存队列中
=============日志=============:更新商品库存请求,商品id=1,商品库存数量=80
===========日志===========: 路由内存队列,商品id=1, 队列索引=1
===========日志===========: 工作线程处理请求,商品id=1
===========日志===========: 数据库更新请求开始执行,商品id=1, 商品库存数量=80
===========日志===========: 已删除redis中缓存,key=product:inventory:1
=============日志=============:接受商品库存读请求,商品id=1
===========日志===========: 路由内存队列,商品id=1, 队列索引=1
=============日志=============:在200ms内没有读到redis中的库存缓存
===========日志===========: 路由内存队列,商品id=1, 队列索引=1
===========日志===========: 已更新数据库中的库存,商品id=1,商品库存数量=80
===========日志===========: 工作线程处理请求,商品id=1
=============日志=============:已查询到商品最新的库存数量,商品id=1,商品库存数量=80
=============日志=============:已更新商品库存的缓存,商品id=1,商品库存数量=80,key=product:inventory:1
===========日志===========: 工作线程处理请求,商品id=1
=============日志=============:已查询到商品最新的库存数量,商品id=1,商品库存数量=80
=============日志=============:已更新商品库存的缓存,商品id=1,商品库存数量=80,key=product:inventory:1
- 第一种:
200ms内读取到缓存
=============日志=============:更新商品库存请求,商品id=1,商品库存数量=80
===========日志===========: 路由内存队列,商品id=1, 队列索引=1
===========日志===========: 工作线程处理请求,商品id=1
===========日志===========: 数据库更新请求开始执行,商品id=1, 商品库存数量=80
===========日志===========: 已删除redis中缓存,key=product:inventory:1
=============日志=============:接受商品库存读请求,商品id=1
===========日志===========: 路由内存队列,商品id=1, 队列索引=1
===========日志===========: 已更新数据库中的库存,商品id=1,商品库存数量=80
===========日志===========: 工作线程处理请求,商品id=1
=============日志=============:已查询到商品最新的库存数量,商品id=1,商品库存数量=80
=============日志=============:已更新商品库存的缓存,商品id=1,商品库存数量=80,key=product:inventory:1
=============日志=============:在200ms内读到了redis中的库存缓存,商品id=1,商品库存数量=80