高并发系统设计:从理论到实践
开篇:什么是高并发系统?

你有没有在抢红包、秒杀活动或者直播抽奖时遇到过系统卡顿,甚至直接崩溃的情况?这背后其实是一个叫做高并发系统的问题。简单来说,高并发系统就是能同时处理大量用户请求的系统。
比如,一个电商网站在“双11”这种大型促销活动中,可能要在1秒钟内处理上万甚至几十万个用户的访问请求。如果系统没有做好准备,就会出现页面打不开、下单失败等问题。
所以,高并发系统的本质是:让服务在高压环境下依然稳定、快速地响应每一个用户请求。
本篇文章将带你从零基础开始,一步步了解高并发系统的基本原理,并亲手实现一个简单的高并发Web项目!
环境准备:搭建开发环境

所需工具清单:
| 工具 | 作用 |
|---|---|
| JDK 8+ | Java运行环境 |
| IntelliJ IDEA | Java代码编写工具 |
| MySQL 5.7+ | 数据库存储数据 |
| Redis | 缓存服务器(用于优化性能) |
| Maven | 项目构建工具 |
| Postman / Apifox | 接口测试工具 |
提示:如果你不熟悉这些工具,不用担心,我们接下来会一步步讲解如何安装。
步骤一:安装JDK
- 访问官网 https://www.oracle.com/java/technologies/downloads/ 下载JDK。
- 安装完成后,在命令行输入以下命令确认是否安装成功:
java -version - 出现类似如下输出,说明安装成功:
java version "17.0.1"
步骤二:安装IntelliJ IDEA
- 访问 https://www.jetbrains.com/idea/download/
- 下载并安装Community版本(免费使用)
- 安装后打开IDEA → 创建新项目时选择Maven项目模板
步骤三:安装MySQL与Redis
MySQL安装:
- Windows:下载MySQL Installer
- Mac/Linux:使用Homebrew或apt-get安装
- 安装后创建数据库如
high_concurrent_system
Redis安装:
- Windows可以使用WSL安装Linux版Redis
- Linux下可使用命令安装:
sudo apt install redis-server - 启动Redis:
redis-server
核心概念:理解高并发的关键术语

下面是一些我们在学习高并发系统时必须了解的概念,我用最通俗的语言来解释它们👇:
1. 并发 vs 并行
- 并发(Concurrency):多个任务交替执行(看起来像是同时做多件事)
- 并行(Parallelism):多个任务真正同时执行(依赖多核CPU)
想象你在写作业,电话响了,你接个电话再回来继续写作业 → 这叫并发
如果你有两个大脑,一边写作业一边打电话 → 这才是并行 😄
2. 线程与进程
- 线程:程序中的最小执行单元
- 进程:一个程序启动后就是一个进程,可以包含多个线程
3. 请求(Request)和响应(Response)
- 用户操作网页点击按钮时,浏览器向服务器发送的就是请求
- 服务器收到请求后,做出回复,就是响应
4. QPS(Queries Per Second)
- 表示每秒能处理多少次查询请求
- 是衡量系统处理能力的重要指标
5. 缓存(Cache)
- 把常用数据存在内存里,加快读取速度
- 常用的缓存组件有 Redis、Ehcache、Memcached
6. 负载均衡(Load Balance)
- 将大量的访问请求分配给多个服务器,避免某一台服务器过载
- 常见方案有 Nginx、HAProxy 等
实战项目:从零搭建一个高并发计数器接口

现在我们要动手做一个实战项目 —— “高并发下的访问计数接口”。
这个接口的功能很简单:每次有人调用它,就返回当前总共被访问了多少次。
听起来是不是很简单?但问题在于,如果1秒有1万人来访问它怎么办?
我们来一步步实现它。
第一步:新建Spring Boot项目
使用IntelliJ IDEA创建一个Spring Boot + Maven项目,添加如下依赖项:
<!-- Spring Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Redis支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Lettuce连接池 -->
<dependency>
<groupId>io.lettuce.core</groupId>
<artifactId>lettuce-core</artifactId>
</dependency>
第二步:配置Redis连接信息
在application.yml中填写你的Redis地址和端口:
spring:
redis:
host: localhost
port: 6379
Redis默认在本地运行,端口6379
第三步:创建Controller类
新建一个类CounterController.java:
@RestController
public class CounterController {
private final String COUNTER_KEY = "visit_count";
@Autowired
private RedisTemplate<String, Integer> redisTemplate;
@GetMapping("/count")
public Map<String, Object> count() {
// 使用Redis自增
Long count = redisTemplate.opsForValue().increment(COUNTER_KEY);
Map<String, Object> result = new HashMap<>();
result.put("count", count);
return result;
}
}
这段代码做了什么?
- 当用户访问
/count接口时,调用 Redis 的INCR操作对某个键(COUNTER_KEY)进行自增 - 然后把结果以JSON格式返回
第四步:启动项目并测试
- 启动你的Spring Boot项目
- 打开 Postman 或者使用 curl 命令测试访问:
curl http://localhost:8080/count
你应该会看到输出如下内容:
{
"count": 1
}
多次调用,你会发现值在不断增加!
🎉 到这里为止,我们的高并发计数接口已经完成!
拓展提升:加入限流与降级机制
当访问量非常大时,我们需要为接口加上一些保护措施,防止被恶意刷爆或崩溃。
1. 加入限流机制(Rate Limit)
使用Redis + Lua脚本实现基本限流(每分钟最多允许1000次访问)
@GetMapping("/rate_limited_count")
public ResponseEntity<?> rateLimitedCount(HttpServletRequest request) {
String ip = request.getRemoteAddr();
String key = "rate_limit:" + ip;
// 通过Lua脚本保证原子性
Long count = (Long) redisTemplate.execute(
(RedisConnection connection) -> {
byte[] script = ("local current = redis.call('INCR', KEYS[1])\n" +
"if tonumber(current) == 1 then\n" +
" redis.call('EXPIRE', KEYS[1], 60)\n" +
"end\n" +
"return current").getBytes();
return connection.eval(script, ScriptType.READ_ONLY,
key.getBytes(), Collections.EMPTY_LIST.toArray());
}, null);
if (count > 1000) {
return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS)
.body("请求次数超限,请稍后再试");
}
// 成功调用计数器
Long total = redisTemplate.opsForValue().increment(COUNTER_KEY);
return ResponseEntity.ok(Map.of("count", total));
}
2. 加入降级机制(Fallback)
当Redis不可用时,返回一个固定数值而不抛出异常:
@GetMapping("/fallback_count")
public ResponseEntity<?> fallbackCount() {
try {
// 正常逻辑
Long total = redisTemplate.opsForValue().increment(COUNTER_KEY);
return ResponseEntity.ok(Map.of("count", total));
} catch (Exception e) {
// 异常情况降级处理
return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE)
.body(Map.of("count", 999999, "status", "Degraded mode"));
}
}

常见问题解答(FAQ)
❓ 为什么不能直接用数据库做计数?
✅ 回答:数据库在并发高的情况下性能差很多。Redis是内存型数据库,速度非常快,适合高并发场景。
❓ 我的Redis连不上怎么办?
✅ 回答:检查两个点:
- Redis服务是否正在运行?
application.yml中配置的host和port是否正确?
❓ 如何测试高并发效果?
✅ 回答:你可以使用工具如 Apache JMeter 或 ab(Apache Bench) 来模拟并发请求,例如:
ab -n 10000 -c 100 http://localhost:8080/count
代表发起10000次请求,其中并发100个线程。
学习建议:下一步该学什么?
学完本教程之后,你可以继续深入学习以下方向:
👇 阶段一:巩固基础
- 多线程与线程池的使用(ThreadPoolExecutor)
- HTTP协议详解(状态码、长连接等)
- Spring MVC生命周期
👇 阶段二:分布式进阶
- 消息队列(Kafka / RabbitMQ)
- 分布式锁(Redis RedLock)
- 微服务架构(Spring Cloud)
👇 阶段三:性能调优
- JVM调优技巧
- 数据库优化(索引、慢SQL分析)
- 使用Prometheus + Grafana做监控
总结
这篇文章带大家了解了什么是高并发系统,以及如何通过实际例子构建一个高并发的接口。我们重点介绍了Redis在处理高并发请求上的强大能力,并通过具体的Java代码实现了相关功能。
希望你从这篇文章中学到了:
- 高并发的核心思想是什么
- 如何用Redis解决并发问题
- 如何写出一个简单的高并发接口
- 如何应对常见问题和进一步学习路线
如果你刚开始接触这类系统,记得多动手敲代码,多测压。高并发世界的大门,已经为你打开了 💪
下一步推荐学习资料:
- 《Java并发编程实战》
- 《Redis设计与实现》
- B站搜索关键词:“高并发系统设计”、“Java并发”
祝你一路通关!🚀

评论 0