高并发秒杀系统设计思路

博客介绍了前端技术、Redis的运用,重点讲述Java并发队列(ConcurrentLinkedQueue、LinkedBlockingQueue、ArrayBlockingQueue)的选择及应用。还提及数据库设计概念,如单库、分片、分组,以及数据路由规则。此外,分析了高并发带来的挑战,强调请求接口要合理设计且响应快。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前端技术运用

二、Ridis运用

三、Java数据结构运用

Java并发队列的选择

Java的并发包提供了三个常用的并发队列实现,分别是:ConcurrentLinkedQueue LinkedBlockingQueue ArrayBlockingQueue。

ArrayBlockingQueue是初始容量固定的阻塞队列,我们可以用来作为数据库模块成功竞拍的队列,比如有10个商品,那么我们就设定一个10大小的数组队列。

ConcurrentLinkedQueue使用的是CAS原语无锁队列实现,是一个异步队列,入队的速度很快,出队进行了加锁,性能稍慢。

LinkedBlockingQueue也是阻塞的队列,入队和出队都用了加锁,当队空的时候线程会暂时阻塞。

 

四、数据库设计

概念一“单库”

输入图片说明

概念二“分片”

输入图片说明

分片解决的是“数据量太大”的问题,也就是通常说的“水平切分”。一旦引入分片,势必有“数据路由”的概念,哪个数据访问哪个库。路由规则通常有3种方法:

 

概念三“分组”

输入图片说明

5 大并发带来的挑战

5.1 请求接口的合理设计

一个秒杀或者抢购页面,通常分为2个部分,一个是静态的HTML等内容,另一个就是参与秒杀的Web后台请求接口

通常静态HTML等内容,是通过CDN的部署,一般压力不大,核心瓶颈实际上在后台请求接口上。这个后端接口,必须能够支持高并发请求,同时,非常重要的一点,必须尽可能“快”,在最短的时间里返回用户的请求结果。为了实现尽可能快这一点,接口的后端存储使用内存级别的操作会更好一点。仍然直接面向MySQL之类的存储是不合适的,如果有这种复杂业务的需求,都建议采用异步写入

输入图片说明

当然,也有一些秒杀和抢购采用“滞后反馈”,就是说秒杀当下不知道结果,一段时间后才可以从页面中看到用户是否秒杀成功。但是,这种属于“偷懒”行为,同时给用户的体验也不好,容易被用户认为是“暗箱操作”。

5.2 高并发的挑战:一定要“快”

我们通常衡量一个Web系统的吞吐率的指标是QPS(Query Per Second,每秒处理请求数),解决每秒数万次的高并发场景,这个指标非常关键。举个例子,我们假设处理一个业务请求平均响应时间为100ms,同时,系统内有20台Apache的Web服务器,配置MaxClients为500个(表示Apache的最大连接数目)。

 

导入依赖Mybatis Plus 依赖,在Mybatis Plus官网安装模块,选择spring boot的maven依赖包 <!-- Mybatis Plus组件--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> 2.配置文件 spring: #thymeleaf配置 thymeleaf: # 关闭缓存 cache: false datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/seckill?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai username: root password: 123456 hikari: # 连接池名(据说是最快的连接池) pool-name: DataHikariCP # 最小空闲连接数 minimum-idle: 5 # 空闲连接存活最大时间,默认600000(10分钟) idle-timeout: 18000 # 最大连接数,默认10 maximum-pool-size: 10 # 从连接池返回的连接自动提交 auto-commit: true # 连接最大存活时间,0表示永久存活,默认1800000(30分钟) max-lifetime: 1800000 # 连接超时时间,默认30000(30秒) connection-timeout: 30000 # 测试连接是否可用的查询语句 connection-test-query: SELECT 1 #Mybatis-plus配置 mybatis-plus: #配置Mapper.xml映射文件 mapper-locations: classpath*:/mapper/*Mapper.xml #配置Mybatis数据返回数据别名(默认别名是类名) type-aliases-package: com.csl.seckill.pojo logging: level: com.csl.seckill.mapper: debug 3.创建包 在java包下面的seckill包下,创建controller,service,pojo,mapper包,在service包下创建impl包 在resource包下创建mapper包,放置mapper文件 其中templates包下放置前端页面 4.测试 ①在启动类中添加注解:@MapperScan("com.csl.seckill.pojo"),添加此注解以后,com.csl.seckill.pojo包下面的接口类,在编译之后都会生成相应的实现类。 ②写一个页面跳转controller 首先声明是controller层(@controller) 请求地址时http://localhost:8080/demo/hello 使用@RequestMapping注解进行映射,返回映射的页面名称 @Controller @RequestMapping("/demo") public class DemoController { /** * 测试页面跳转 * @param model * @return */ @RequestMapping("/hello") public String hello(Model model){ model.addAttribute("name","csl"); return "hello"; } } ③创建一个hello页面: <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="U
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值