高并发系统设计:从理论到实践

InnovationLab
2025-06-17 13:17
阅读 560

开篇:什么是高并发系统?

开篇:什么是高并发系统?

你有没有在抢红包、秒杀活动或者直播抽奖时遇到过系统卡顿,甚至直接崩溃的情况?这背后其实是一个叫做高并发系统的问题。简单来说,高并发系统就是能同时处理大量用户请求的系统。

比如,一个电商网站在“双11”这种大型促销活动中,可能要在1秒钟内处理上万甚至几十万个用户的访问请求。如果系统没有做好准备,就会出现页面打不开、下单失败等问题。

所以,高并发系统的本质是:让服务在高压环境下依然稳定、快速地响应每一个用户请求

本篇文章将带你从零基础开始,一步步了解高并发系统的基本原理,并亲手实现一个简单的高并发Web项目!


环境准备:搭建开发环境

环境准备:搭建开发环境

所需工具清单:

工具 作用
JDK 8+ Java运行环境
IntelliJ IDEA Java代码编写工具
MySQL 5.7+ 数据库存储数据
Redis 缓存服务器(用于优化性能)
Maven 项目构建工具
Postman / Apifox 接口测试工具

提示:如果你不熟悉这些工具,不用担心,我们接下来会一步步讲解如何安装。

步骤一:安装JDK

  1. 访问官网 https://www.oracle.com/java/technologies/downloads/ 下载JDK。
  2. 安装完成后,在命令行输入以下命令确认是否安装成功:
    java -version
    
  3. 出现类似如下输出,说明安装成功:
    java version "17.0.1"
    

步骤二:安装IntelliJ IDEA

  1. 访问 https://www.jetbrains.com/idea/download/
  2. 下载并安装Community版本(免费使用)
  3. 安装后打开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格式返回

第四步:启动项目并测试

  1. 启动你的Spring Boot项目
  2. 打开 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"));
    }
}

负载均衡配置-1


常见问题解答(FAQ)

❓ 为什么不能直接用数据库做计数?

✅ 回答:数据库在并发高的情况下性能差很多。Redis是内存型数据库,速度非常快,适合高并发场景。

❓ 我的Redis连不上怎么办?

✅ 回答:检查两个点:

  • Redis服务是否正在运行?
  • application.yml中配置的host和port是否正确?

❓ 如何测试高并发效果?

✅ 回答:你可以使用工具如 Apache JMeterab(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解决并发问题
  • 如何写出一个简单的高并发接口
  • 如何应对常见问题和进一步学习路线

如果你刚开始接触这类系统,记得多动手敲代码,多测压。高并发世界的大门,已经为你打开了 💪


下一步推荐学习资料

  1. 《Java并发编程实战》
  2. 《Redis设计与实现》
  3. B站搜索关键词:“高并发系统设计”、“Java并发”

祝你一路通关!🚀

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝