当前位置: 首页 > news >正文

秒杀系统如何设计

 秒杀系统主要有以下特点

1、高并发瞬时流量
2、热点数据
3、数据量大
4、库存的正确扣减
5、黄牛抢购
6、重复下单
7、对普通交易的影响

前后端缓存

首先是秒杀功能的开启,以及前端资源的访问,这部分内容一般都是提前放到CDN中,让这些静态资源离用户更近就能让用户访问的更快

秒杀系统,会在前端,也就是客户端层面做一些请求的随机丢弃,这些被丢弃的请求就直接返回失败,或者系统繁忙,让用户重试。过滤掉一部分流量向服务端发送

可以配置一些黑白名单、可以通过IP进行限流、也可以做一些业务校验都是可以的 

服务器层面也是配置很多限流策略的,基于sentinel,或者自己实现一些限流算法,都是可以做动态限流的
还有就是,服务器中有一些查询操作,和一部分写操作,其实是可以用缓存来抗一下的。在缓存上本地缓存要比分布式缓存的性能更高,近端缓存要好于远端缓存

数据预热

秒杀系统另外一个比较典型的特点就是会存在热点数据,因为大家都会抢购同一件商品,那么这个商品就会变成热点数据。秒杀是可以提前预知哪些数据会变成热点的,所以可以提前做一些缓存的预热,对于热点数据,不仅需要在Redis中做预热,还需要在本地缓存也做预热,避免Redis的热key问题。

数据量大

这时候就可以考虑要么就加缓存、要么就用ES、要么就做分库分表。还有就是做数据归档,把历史数据归档掉,无非就是这么几个方案了。

库存扣减

可以利用redis单线程特性,进行库存扣减,发送MQ同步数据库,减少因加锁带来的线程等待问题

黄牛抢购

根据用户的IP、设备信息、网络信息、行为数据等进行分析,推断哪些是黄牛

这部分用户的ID直接可以加入黑名单中,除了用户ID以外,还需要对他的IP地址、设备等进行限流,比如限制某个IP一段时间内只能下单几次,基于令牌桶、漏桶等限流算法都能实现。我们也可以直接借助nginx、 sentinel、guava等进行限流的实现

重复下单

加redis分布式锁

对普通交易的影响

按照业务量做隔离措施,逻辑隔离(业务代码拆分)或者物理隔离(服务器拆分)

业务手段

有的时候,我们不能只想着用技术手段解决所有问题,其实,如果在业务上能做点事情的话,如果这些做法并不影响用户体验,那么就可能让技术实现上大大简化方案,整个系统的成本和稳定性也会有大大的提高。
比如我们前面说的限购
再比如说,在有些秒杀业务中,需要先预约,预约通过后才能参与秒杀,这就大大的降低了秒杀时的请求量了。
再比如说很多电商最近再搞一些预售的功能,其实也是有这方面的考虑的。

还有就是秒杀时通过一些验证码、问题等,也可以降低瞬时的高并发流量,

相关文章:

  • Linux文件
  • Python - 深夜数据结构与算法之 AVL 树 红黑树
  • 案例123:基于微信小程序的在线订餐系统的设计与实现
  • 使用scipy处理图片——旋转任意角度
  • K8S--Ingress的作用
  • 结构化数据,非结构化数据,半结构化数据(AI问答)
  • 数据通信基础
  • gcd得最大公约数,辗转相除法理解
  • Dockerfile镜像实战
  • ReactHooks:渲染与useState
  • openssl3.2 - 在VS2019下源码调试openssl.exe
  • 如何通过Burp Suite专业版构建CSRF PoC
  • 【纯CSS特效源码】(二)精美的立体字
  • JavaScript基础05
  • css 怎么绘制一个带圆角的渐变色的边框
  • 08.Android之View事件问题
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • ComponentOne 2017 V2版本正式发布
  • Cookie 在前端中的实践
  • IDEA 插件开发入门教程
  • jdbc就是这么简单
  • js中的正则表达式入门
  • Map集合、散列表、红黑树介绍
  • MaxCompute访问TableStore(OTS) 数据
  • Puppeteer:浏览器控制器
  • Redux系列x:源码分析
  • Spring声明式事务管理之一:五大属性分析
  • Zepto.js源码学习之二
  • 诡异!React stopPropagation失灵
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 目录与文件属性:编写ls
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 函数计算新功能-----支持C#函数
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​queue --- 一个同步的队列类​
  • #define用法
  • #ifdef 的技巧用法
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (6)设计一个TimeMap
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (Git) gitignore基础使用
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (四)JPA - JQPL 实现增删改查
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)Dubbo快速入门、介绍、使用
  • (转)视频码率,帧率和分辨率的联系与区别
  • *Django中的Ajax 纯js的书写样式1
  • .Net - 类的介绍
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net