框架:Laravel秒杀组件:商品、秒杀session、Redis、模拟秒杀进程:1.实现商品关联增删改查,秒杀session,秒杀session,商品;2、定时秒杀会话,商品、库存等信息提前写入redis;3、配置Redis持久化;4.实现秒杀的下单逻辑;5、定期删除秒杀过期信息,释放库存;6、使用golang并发编程模拟秒杀。PS:整个过程涉及异步并发:定时存数据到redis,秒杀生成订单,查询当前秒杀商品1.CRUD各表主商品表CREATETABLE`goods`(`id`int(12)unsignedNOTNULLAUTO_INCREMENTCOMMENT'pk',`item_no`varchar(64)NOTNULLCOMMENT'项目编号',`name`varchar(255)NOTNULLCOMMENT'产品名称',`pic_path`varchar(255)DEFAULTNULLCOMMENT'项目header图表路径yzy=>2018-11-19',`shops_id`int(12)unsignedNOTNULLCOMMENT'shopid',`market_price`decimal(11,2)unsignedNOTNULLDEFAULT'0.00'COMMENT'marketprice',`shop_price`decimal(11,2)unsignedNOTNULLDEFAULT'0.00'COMMENT'shopprice',`warn_stock`int(11)unsignedNOTNULLDEFAULT'0'COMMENT'warningstock',`goods_stock`int(11)unsignedNOTNULLDEFAULT'0'COMMENT'总库存',`unit`char(10)NOTNULLCOMMENT'unit',`tip`textCOMMENT'促销信息',`is_sale`tinyint(1)unsignedNOTNULLDEFAULT'1'COMMENT'1=>上架2=》不上架',`is_best`tinyint(1)unsignedNOTNULLDEFAULT'2'COMMENT'1=>boutique2=>non-boutique',`is_hot`tinyint(1)unsignedNOTNULLDEFAULT'2'COMMENT'1=>热卖2=>非热销',`is_new`tinyint(1)unsignedNOTNULLDEFAULT'2'COMMENT'1=>新品2=>非新品',`is_recom`tinyint(1)unsignedNOTNULLDEFAULT'2'COMMENT'1=>推荐2=>不推荐',`is_vip`tinyint(1)NOTNULLCOMMENT'是否是VIP商品,1=》VIP2=》普通',`goods_cats_id_one`int(11)unsignedNOTNULLCOMMENT'商品分类一级id',`goods_cats_id_two`int(11)unsignedNOTNULLCOMMENT'商品分类二级id',`goods_cats_id_three`int(11)unsignedNOTNULLCOMMENT'商品分类三级id',`goods_describe`longtextNOTNULLCOMMENT'Description注:lxs=>调整字段名,类型为longtext',`brokerage`decimal(8,2)NOTNULLDEFAULT'0.00'COMMENT'推荐点率(佣金),单位:%',`brokerage_rules`jsonDEFAULTNULLCOMMENT'推荐点(佣金)分配规则,单位:%,例如:{10,20,30}第一个代表一级',`status`char(3)NOTNULLDEFAULT'100'COMMENT'100=>unapproved200=>approved400=>approvedfailed',`sale_num`int(11)unsignedNOTNULLDEFAULT'0'COMMENT'totalsales',`sale_time`timeDEFAULTNULLCOMMENT'shelftime',`visit_num`int(11)unsignedDEFAULT'0'COMMENT'访问次数',`appraise_num`int(11)unsignedDEFAULTNULLCOMMENT'评论总数',`key_words`varchar(255)DEFAULTNULLCOMMENT'SEO关键字',`remark`varchar(1024)DEFAULTNULLCOMMENT'备注,一般写原因审核失败',`created_at`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',`updated_at`timestampNULLDEFAULTNULLCOMMENT'更新时间',`deleted_at`timestampNULLDEFAULTNULLCOMMENT'删除时间',PRIMARYKEY(`id`)使用BTREE)ENGINE=InnoDBAUTO_INCREMENT=3DEFAULTCHARSET=utf8;子商品表CREATETABLEgoods_items(idint(12)unsignedNOTNULLAUTO_INCREMENTCOMMENT'pk',shops_idint(12)unsignedNOTNULLCOMMENT'shopid',intgoods_id(12)unsignedNOTNULLCOMMENT'itemid',item_novarchar(64)NOTNULLCOMMENT'商品编号',market_pricedecimal(11,2)unsignedNOTNULLDEFAULT'0.00'COMMENT'marketprice',shop_pricedecimal(11,2)unsignedNOTNULLDEFAULT'0.00'COMMENT'storeprice',warn_stockint(11)unsignedNOTNULLDEFAULT'0'COMMENT'warningstock',goods_stockint(11)unsignedNOTNULLDEFAULT'0'COMMENT'图书馆save',statuschar(3)NOTNULLDEFAULT'1'COMMENT'1=>valid2=>invalid',sale_numint(11)unsignedNOTNULLDEFAULT'0'COMMENT'sales',goods_spec_items_idvarchar(255)DEFAULTNULLCOMMENT'规范参数值表的id存储格式,例如:''1:2:3''注:lxs=>修改为空',created_attimestampNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',updated_attimestampNULLDEFAULTNULLCOMMENT'更新时间',deleted_attimestampNULLDEFAULTNULLCOMMENT'删除时间',PRIMARYKEY(id)USINGBTREE)ENGINE=InnoDBAUTO_INCREMENT=3DEFAULTCHARSET=utf8;秒杀时间表CREATETABLE`seckill_sessions`(`id`int(11)unsignedNOTNULLAUTO_INCREMENTCOMMENT'pk',`name`varchar(100)NOTNULLCOMMENT'SecondKillEventName',`start_time`timestampNOTNULLCOMMENT'StartTime',`end_time`timestampNOTNULLCOMMENT'EndTime',`status`tinyint(1)NOTNULLDEFAULT'1'COMMENT'1=>valid2=》invalid',`created_at`timestampNOTNULLDEFAULTCURRENT_TIMESTAMP,`updated_at`timestampNULLDEFAULTNULL,`deleted_at`timestampNULLDEFAULTNULL,主键(`id`))ENGINE=InnoDBAUTO_INCREMENT=3DEFAULTCHARSET=utf8mb4;秒杀会话和产品关联表CREATETABLE`seckill_goods_items`(`id`int(11)unsignedNOTNULLAUTO_INCREMENTCOMMENT'pk',`seckill_sessions_id`int(11)unsignedNOTNULLCOMMENT'Seckillsessionid',`goods_id`int(11)unsignedNOTNULLCOMMENT'productid',`goods_items_id`int(11)unsignedNOTNULLCOMMENT'subcategoryproductid',`name`varchar(255)NOTNULLCOMMENT'产品名称',`pic_path`varchar(255)NOTNULLCOMMENT'ProductImage',`shop_price`decimal(10,2)NOTNULLCOMMENT'秒杀价格',`goods_stock`int(11)NOTNULLCOMMENT'秒杀库存',`seckill_limit`int(11)NOTNULLCOMMENT'秒杀数量限制',`sort`int(11)NOTNULLCOMMENT'sort',`created_at`timestampNOTNULLDEFAULTCURRENT_TIMESTAMP,`updated_at`timestampNULLDEFAULTNULL,`deleted_at`timestampNULLDEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=12DEFAULTCHARSET=utf8mb4;2、提前写redis1,使用Listsession信息:key:session_prefix+session开始时间戳+venue结束时间戳值:sessionid+productid2、使用hash存储商品key的json数据:goods_prefixfield:场地id+商品id值:json_encode(商品信息+活动信息+随机码)3、使用string存储库存信息key:stock_prefix+随机码值:秒杀个股数量4.注意上面的redis数据加上过期时间3.配置Redis持久化。两种持久化模式都开启:RDB(快照模式)+AOF(日志模式)配置文件:save/append_only区别:两种数据保存间隔不同,RDB的存储间隔大于AOF的存储间隔4.实现顺序秒杀逻辑1.查询会话数和当前秒杀产品查询redis中的缓存数据。当并发量大时,可能会出现:缓存穿透:key值不存在,重复请求压垮数据库=>Bloomfilterorsetcacheisempty。缓存崩溃:key值存在但失效,需要重新请求数据库导致并发问题=>SETNX锁缓存雪崩:缓存重启或集中失效,所有请求都发送到DB=>过期时间设置分散2、正式秒杀有两种方式:普通的购物订单流程和单独的秒杀订单功能,这里选择后者,这种方式可以提高并发度和响应速度。3、具体订单逻辑:登录验证=>秒杀流程验证=>通过队列异步下单,返回订单号orderSN。秒杀过程中的验证点如下:秒杀时间:是否在秒杀时间内;乱码:产品是否秒杀;购买数量限制:每次可购买的商品数量;是否已购买:通过redisSETNX设置Key=sessionid_productid_userid来判断是否已购买。秒杀库存数量:在获取对应库存信息前,以随机码为key设置SETNX实现并发锁,设置超时时间,秒杀成功或失败时释放锁。5、定时删除秒杀过期信息,释放库存。读取redis中的信息过滤过期信息,释放库存的同时进行锁定。6、使用golang并发编程模拟秒杀golang并发调度项目代码云:https://gitee.com/jasonlxs/se...具体结果图:
