黑马点评秒杀问题,大佬帮帮

#黑龙江栋脑科技有限公司##面##如果再来一次,你还会选择这个工作吗?##黑马点评##面试##牛客AI配图神器#黑马点评秒杀问题

视频的流程大概是这样的:
- 执行lua脚本,校验下单资格,判断库存是否充足,判断用户是否下过单,如果有资格则在redis与扣减库存,将用户家优惠卷的id设置到set。
- 设置消息并发送到MQ
- 多线程获取消息进行下单
  - 获取消息
  - 扣减库存
  - 创建订单

问题:

- 如果创建订单或者扣减库存失败了,redis的库存已经扣减,用户信息已经设置到set里面,怎么恢复
  - 是在下单加个trycatch,然后恢复吗,还是什么办法
- 如果应用挂机了,trycatch不到了,怎么恢复
  - 添加定时任务检查库存是否一致吗,那要是我扣减lredis的库存,还没有扣减数据库的库存,定时任务执行了,给我恢复了,这不是乱了吗,就是原来reids和mysql都是1,扣减redis为0,定时任务回复为1,数据库扣减为0
- 怎么保证库存的一致性
全部评论
其实你这个问题千言万语是一句话:如何保证Redis跟数据库的一致性嘛。 各大公司都是有那种对账的。数据一致性校验平台这种中间件来去确保二者之间数据的一致性。 你可以这样理解,就是我们在这个平台上面呢会基于代码呢去实现一个规则,就是说我去监听数据库的binlog日志,然后会对binlog日志进行实时解析,跟目标数据源进行对比,以此呢来判断数据是否一致。 那放到你这个场景里面呢,就是说每当一个用户的优惠券落库的时候呢,那它会产生对应的log日志,我们就把这个日志捞出来,从log日志里面取出信息拼接Redis的对应key,查一遍Redis。 如果radius里面有数据,那就说明c口跟log的数据是一致的,如果没有就说明他们两个有一端不可信嘛,那你就选择可信的一端,对另外一端进行数据补偿就好。
1 回复 分享
发布于 06-15 11:58 浙江
m
点赞 回复 分享
发布于 06-14 21:52 北京

相关推荐

06-15 16:08
河南大学 Java
查看19道真题和解析 面试问题记录
点赞 评论 收藏
分享
评论
点赞
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务