我是靠谱客的博主 威武彩虹,最近开发中收集的这篇文章主要介绍如何实现秒杀(逻辑过程),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

对于秒杀任务,我们首先要考虑的是怎么能在有限的设备上达到最高的并发

因为秒杀是典型的高性能高并发的业务需求

所以我们要尽可能的使用能够提升性能和并发的组件或功能

同时保证服务器的稳定运行

例如: Redis、ES、Sentinel、消息队列等

具体实现秒杀需要几个步骤

秒杀前准备

我们可以利用任务调度工具Quartz在指定的时间进行缓存预热工作

主要两方面

  1. 在秒杀开始前指定的时间,Redis缓存预热,将每个sku参与秒杀的库存数保存在Redis中。并且为了避免有人利用技术手段频繁访问,可以生成一个随机码,也保存在Redis中,用于验证是否为正常链接购买秒杀商品

  1. 在每个批次秒杀开始前,将本批次所有秒杀商品的spuid保存在布隆过滤器中,减少缓存穿透的情况

秒杀信息的查询

秒杀开始,用户在秒杀商品的规定时间内可以查询秒杀商品详情

所有秒杀商品spu查询时,都先查询布隆过滤器是否包含这个spuid,如果包含,允许访问,如果不包含则抛出异常,也要考虑布隆过滤器的误判情况。每当业务中查询spu和sku时,都需要先检查Redis中是否包含这个数据,如果包含直接从Redis中获得,如果不包含再从数据库中查,查询完了要保存到Redis中,以便之后的查询直接从Redis中获取,在保存到Redis中,为了减少缓存雪崩的几率,为每个spu和sku对象都添加了过期时间随机数

查询返回前,可以再判断一下当前时间是否在可秒杀该商品的时间段内,如果不在秒杀时间段内,抛出异常

只有返回了完整信息,前端才可能获得包含随机码的提交路径,否则是无法完成正常链接购买的

提交秒杀信息

在用户购买秒杀商品时,保证用户登陆的前提下

验证用户是否重复秒杀(我们业务中相同秒杀商品只能购买一次),我们使用userid和skuid,向Redis中保存一个key,如果没有这个key就是用户没有秒杀过该商品,否则发生异常提示

保证用户购买时,这个商品有库存,减少库存后,获得剩余库存信息,只要剩余库存不小于0,就可以为当前用户生成订单,否则发生异常

生成订单直接Dubbo调用Order模块编写的生成订单的方法即可

订单提交后,还需要修改秒杀sku库存数,并生成秒杀成功记录保存在数据库,但是这个任务并非迫切运行,可以将信息发送给消息队列,削峰填谷,然后再编写接收消息队列的代码,

最后

以上就是威武彩虹为你收集整理的如何实现秒杀(逻辑过程)的全部内容,希望文章能够帮你解决如何实现秒杀(逻辑过程)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部