概述
对于秒杀任务,我们首先要考虑的是怎么能在有限的设备上达到最高的并发
因为秒杀是典型的高性能高并发的业务需求
所以我们要尽可能的使用能够提升性能和并发的组件或功能
同时保证服务器的稳定运行
例如: Redis、ES、Sentinel、消息队列等
具体实现秒杀需要几个步骤
秒杀前准备
我们可以利用任务调度工具Quartz在指定的时间进行缓存预热工作
主要两方面
在秒杀开始前指定的时间,Redis缓存预热,将每个sku参与秒杀的库存数保存在Redis中。并且为了避免有人利用技术手段频繁访问,可以生成一个随机码,也保存在Redis中,用于验证是否为正常链接购买秒杀商品
在每个批次秒杀开始前,将本批次所有秒杀商品的spuid保存在布隆过滤器中,减少缓存穿透的情况
秒杀信息的查询
秒杀开始,用户在秒杀商品的规定时间内可以查询秒杀商品详情
所有秒杀商品spu查询时,都先查询布隆过滤器是否包含这个spuid,如果包含,允许访问,如果不包含则抛出异常,也要考虑布隆过滤器的误判情况。每当业务中查询spu和sku时,都需要先检查Redis中是否包含这个数据,如果包含直接从Redis中获得,如果不包含再从数据库中查,查询完了要保存到Redis中,以便之后的查询直接从Redis中获取,在保存到Redis中,为了减少缓存雪崩的几率,为每个spu和sku对象都添加了过期时间随机数
查询返回前,可以再判断一下当前时间是否在可秒杀该商品的时间段内,如果不在秒杀时间段内,抛出异常
只有返回了完整信息,前端才可能获得包含随机码的提交路径,否则是无法完成正常链接购买的
提交秒杀信息
在用户购买秒杀商品时,保证用户登陆的前提下
验证用户是否重复秒杀(我们业务中相同秒杀商品只能购买一次),我们使用userid和skuid,向Redis中保存一个key,如果没有这个key就是用户没有秒杀过该商品,否则发生异常提示
保证用户购买时,这个商品有库存,减少库存后,获得剩余库存信息,只要剩余库存不小于0,就可以为当前用户生成订单,否则发生异常
生成订单直接Dubbo调用Order模块编写的生成订单的方法即可
订单提交后,还需要修改秒杀sku库存数,并生成秒杀成功记录保存在数据库,但是这个任务并非迫切运行,可以将信息发送给消息队列,削峰填谷,然后再编写接收消息队列的代码,
最后
以上就是威武彩虹为你收集整理的如何实现秒杀(逻辑过程)的全部内容,希望文章能够帮你解决如何实现秒杀(逻辑过程)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复