> 技术文档 > Redis--多路复用

Redis--多路复用


🧩 一、什么是“客户端连接”?

所谓 客户端连接 Redis,指的是:

一个程序(客户端)通过网络连接到 Redis 服务端(比如 127.0.0.1:6379),建立一个 TCP 连接,双方可以互相发送消息(命令/结果)。

这个“客户端”可以是:

  • 你写的 Java 项目(比如用 Jedis、Lettuce);

  • 你用 redis-cli 工具;

  • Python、Node.js、Go 写的服务,只要它访问 Redis,就是一个客户端。


🎯 什么时候会建立客户端连接?

  1. 你第一次在代码里用 Redis 时,比如:

Jedis jedis = new Jedis(\"127.0.0.1\", 6379);jedis.get(\"user:1\");

这行代码就会主动建立一个 TCP 连接到 Redis!

  1. 多个线程/服务同时访问 Redis,每个线程或连接池里的连接,都会和 Redis 建一个连接。

  2. Redis 客户端连接是**“长连接”**(不是请求完就断),多个命令会复用同一个连接。


🖥 举个例子:

假设你有一个电商系统:

  • 10 个接口要查 Redis 的库存信息;

  • 每个接口用的是独立的连接;

  • 那么 Redis 就会有 10 个客户端连接。

这些连接 Redis 会“记住”,维护它们的 socket,等有命令发过来就处理。


🔁 有多路复用 vs 没有多路复用,有啥区别?

✅ 有多路复用(Redis 的方式)

  • Redis 用一个线程监听所有客户端连接;

  • 哪个连接来了命令,就处理哪个;

  • 没有命令的连接挂起,不浪费资源;

  • 高效、轻量,单线程高并发。

❌ 没有多路复用(传统方式)

  • 每个连接都起一个线程;

  • 10 个连接就 10 个线程,1000 个连接就 1000 个线程;

  • 线程太多会造成系统开销大、调度慢、CPU 压力大;

  • 容易性能下降、响应慢。


📌 打个比方

  • 有多路复用:你是前台接待员,戴了高科技耳机(epoll),可以同时监听 1000 个客户叫你,一旦有人说话你就回应;

  • 没多路复用:你请了 1000 个接待员,每人守一个窗口,可能大多数人都在发呆,还要发工资(消耗资源)。

✅ 什么是 Redis 的多路复用?

Redis 的多路复用是一种基于事件驱动的 I/O 机制,用于在单个线程中同时监听和处理多个客户端连接的读写事件。

它的核心原理是利用操作系统提供的 I/O 多路复用接口(如 epollkqueue),实现:

  • 在一个线程里同时监听上千个 socket(即客户端连接);

  • 哪个连接有数据就处理哪个,其他连接保持挂起,不占用资源。

Redis 通过 ae 模块实现了对不同操作系统多路复用接口的统一封装。


🌟 有什么好处?

好处 说明 1. 高并发 单线程就能同时处理成千上万客户端连接,不需要开多个线程 2. 性能高 减少线程切换和上下文开销,CPU 利用率高 3. 编程简单 所有命令在一个线程中顺序执行,避免了加锁和线程安全问题 4. 响应快 所有请求都是内存级操作,搭配非阻塞 I/O,响应非常迅速

📌统一回答:

Redis 的多路复用是一种基于 I/O 多路复用机制的事件驱动模型,它允许 Redis 在一个线程中同时监听多个客户端连接的读写事件。底层通过 epoll(Linux)、kqueue(macOS)等实现,从而做到高并发、高性能的处理请求。它的好处是减少资源占用、避免线程切换,同时保持了 Redis 命令的原子性和简单性。