尖峰业务在电子商务领域中,存在典型的尖峰业务场景,那么什么是尖峰场景?简而言之,产品的购买者数量远远大于产品的库存,并且该产品将在短时间内被抢购一空。
例如,年度618,双11大促销和小米新产品促销等业务场景就是典型的峰值业务场景。
峰值业务的最大特点是瞬时并发流量高。
在电子商务系统中,库存数量通常比并发流量要少得多。
例如:天猫的加急活动可能只有几百或数千个库存商品,并且它们的大量涌入立即并发购买可能会达到数以千万计的流量。
因此,我们可以总结如下秒杀系统的业务特征。
(一)限时,限价,限价是在规定的时间内进行的;高峰活动中的商品数量是有限的;商品的价格将远低于原始价格,即在秒杀活动中,商品将以低于原始价格的价格出售。
例如,某天的加班活动时间被限制为上午10点至上午10:30,商品数量仅为100,000件,且商品价格非常低,例如:1元购货和其他业务场景。
时间限制,限制和价格可以单独存在或组合存在。
(2)事件的预热需要预先配置事件;当事件尚未开始时,用户可以查看事件的相关信息;在尖峰事件开始之前,将大力推广该事件。
(3)在短时间内购买的人数众多;货物很快就会被抢购一空。
在呈现系统流量时,会出现突然的尖峰现象。
目前,并发访问的数量非常高。
在大多数高峰情况下,货物将在很短的时间内售罄。
尖峰通常分为三个阶段,从尖峰的开始到结束,通常分为三个阶段:准备阶段:此阶段也称为系统预热阶段。
这时,秒杀系统的业务数据将提前预热,这时用户通常会继续刷新秒杀页面,以检查秒杀活动是否已经开始。
在一定程度上,可以将某些数据存储在Redis中,以通过用户连续的页面刷新操作进行预热。
尖峰阶段:此阶段主要是尖峰活动的过程,它将产生瞬时的高并发流量,这将对系统资源产生巨大影响。
因此,必须在尖峰阶段进行系统保护。
结算阶段:峰值完成后的数据处理,例如数据一致性问题处理,异常情况处理和退货处理。
Redis帮助秒杀系统我们可以在Redis中设计一个Hash数据结构来支持扣除商品库存,如下所示。
seckill:goodsStock:$ {goodsId} {totalCount:200,initStatus:0,seckillCount:0}在我们设计的Hash数据结构中,有三个非常主要的属性。
totalCount:表示参与高峰的产品总数。
在尖峰活动开始之前,我们需要预先将此值加载到Redis缓存中。
initStatus:我们将此值设计为布尔值。
在尖峰开始之前,该值为0,这表示尖峰尚未开始。
您可以通过定时任务或后台操作将此值修改为1,这意味着尖峰开始。
seckillCount:指示被秒杀的产品数。
在秒杀过程中,此值的上限为totalCount。
当该值达到totalCount时,表示产品的秒杀操作已完成。
我们可以使用以下代码片段来缓存将在尖峰的预热阶段参与尖峰的产品数据加载。
/ ** * @author binghe * @description在seckill之前构造产品缓存代码的示例* /公共类SeckillCacheBuilder {private static final String GOODS_CACHE =“ seckill:goodsStock:”;私有字符串getCacheKey(String id){返回GOODS_CACHE。
);} public void prepare(String id,int totalCount){String key = getCacheKey(id);地图商品= new HashMap(); Goods.put(“ totalCount”,totalCount);“ goods.put(“ totalCount”,totalCount);“ good”。
); goods.put(“ seckillCount”,0); redisTemplate.opsForHash()。
putAll(key,goods);在seckill开始时,我们需要确定缓存中的seckillCount值是否小于代码中的totalCount值。
如果seckillCount值确实小于totalCount值,则可以锁定清单。
在我们的程序中,这两个步骤实际上不是原子的。
如果在分布式环境中,我们将使用多台机器进行操作