1.如果把秒杀活动信息全部放入redis,后台系统要查看历史活动信息只能从redis获取。就算redis开启AOF和RDB混合模式落盘,可能也会造成数据有一秒钟的丢失(除非开启AOF每次写操作都落盘,但这样会降低性能)。
2.如果redis内存不够也会触发内存淘汰机制,可能会把历史活动信息删除。
以上两种情况都可能造成订单数据和活动数据不一致情况
我暂时想到三种方案:
方案一:用定时任务定时查redis活动信息,写进数据库。并在redis中删除已结束的活动信息。这样历史活动信息还是从数据库查询。这种方案的弊端是信息会有一定延迟,比如剩余库存。
方案二:创建秒杀活动的时候在redis和数据库都保存一份。redis扣减库存成功后,再去扣减数据库库存。历史活动信息还是从数据库查询,这个方案弊端是在高并发下接口性能会下降,因为多了一次从数据库扣库存的操作。
方案三:在方案二的基础上做优化,redis扣减库存成功后,通过MQ异步扣减数据库库存。这样就不会有性能影响。这个方案弊端需要引入MQ,会引入消息失败重试,消费幂等性等其他问题。
以上是我暂时想到的三种方案,感觉都多多少少有点问题。希望老师指点一下,谢谢老师。