请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于把秒杀活动放入redis的疑问

1.如果把秒杀活动信息全部放入redis,后台系统要查看历史活动信息只能从redis获取。就算redis开启AOF和RDB混合模式落盘,可能也会造成数据有一秒钟的丢失(除非开启AOF每次写操作都落盘,但这样会降低性能)。
2.如果redis内存不够也会触发内存淘汰机制,可能会把历史活动信息删除。

以上两种情况都可能造成订单数据和活动数据不一致情况

我暂时想到三种方案:
方案一:用定时任务定时查redis活动信息,写进数据库。并在redis中删除已结束的活动信息。这样历史活动信息还是从数据库查询。这种方案的弊端是信息会有一定延迟,比如剩余库存。

方案二:创建秒杀活动的时候在redis和数据库都保存一份。redis扣减库存成功后,再去扣减数据库库存。历史活动信息还是从数据库查询,这个方案弊端是在高并发下接口性能会下降,因为多了一次从数据库扣库存的操作。

方案三:在方案二的基础上做优化,redis扣减库存成功后,通过MQ异步扣减数据库库存。这样就不会有性能影响。这个方案弊端需要引入MQ,会引入消息失败重试,消费幂等性等其他问题。

以上是我暂时想到的三种方案,感觉都多多少少有点问题。希望老师指点一下,谢谢老师。

正在回答 回答被采纳积分+3

1回答

InCowboy 2021-01-13 19:59:57

关于秒杀活动同学考虑的已经很周全,首页关于秒杀这类活动有个大的前提就是少卖要比超卖,因为超卖比较麻烦,所以卖少了顶多就是销量差了点但不会出问题,其次呢就是关于活动历史数据的问题,就像你说的其实历史数据是可以放在数据库的,然后Redis只需要同步秒杀活动的商品与数量即可,然后等活动结束以后,将Redis的库存在重新同步到数据库就行了

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信