🧩 一、什么是“客戶端連接”?
所謂 客戶端連接 Redis,指的是:
一個程序(客戶端)通過網絡連接到 Redis 服務端(比如 127.0.0.1:6379),建立一個 TCP 連接,雙方可以互相發送消息(命令/結果)。
這個“客戶端”可以是:
你寫的 Java 項目(比如用 Jedis、Lettuce);
你用
redis-cli
工具;Python、Node.js、Go 寫的服務,只要它訪問 Redis,就是一個客戶端。
🎯 什么時候會建立客戶端連接?
你第一次在代碼里用 Redis 時,比如:
Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.get("user:1");
這行代碼就會主動建立一個 TCP 連接到 Redis!
多個線程/服務同時訪問 Redis,每個線程或連接池里的連接,都會和 Redis 建一個連接。
Redis 客戶端連接是**“長連接”**(不是請求完就斷),多個命令會復用同一個連接。
🖥 舉個例子:
假設你有一個電商系統:
10 個接口要查 Redis 的庫存信息;
每個接口用的是獨立的連接;
那么 Redis 就會有 10 個客戶端連接。
這些連接 Redis 會“記住”,維護它們的 socket,等有命令發過來就處理。
🔁 有多路復用 vs 沒有多路復用,有啥區別?
? 有多路復用(Redis 的方式)
Redis 用一個線程監聽所有客戶端連接;
哪個連接來了命令,就處理哪個;
沒有命令的連接掛起,不浪費資源;
高效、輕量,單線程高并發。
? 沒有多路復用(傳統方式)
每個連接都起一個線程;
10 個連接就 10 個線程,1000 個連接就 1000 個線程;
線程太多會造成系統開銷大、調度慢、CPU 壓力大;
容易性能下降、響應慢。
📌 打個比方
有多路復用:你是前臺接待員,戴了高科技耳機(epoll),可以同時監聽 1000 個客戶叫你,一旦有人說話你就回應;
沒多路復用:你請了 1000 個接待員,每人守一個窗口,可能大多數人都在發呆,還要發工資(消耗資源)。
? 什么是 Redis 的多路復用?
Redis 的多路復用是一種基于事件驅動的 I/O 機制,用于在單個線程中同時監聽和處理多個客戶端連接的讀寫事件。
它的核心原理是利用操作系統提供的 I/O 多路復用接口(如
epoll
、kqueue
),實現:
在一個線程里同時監聽上千個 socket(即客戶端連接);
哪個連接有數據就處理哪個,其他連接保持掛起,不占用資源。
Redis 通過
ae
模塊實現了對不同操作系統多路復用接口的統一封裝。
🌟 有什么好處?
好處 說明 1. 高并發 單線程就能同時處理成千上萬客戶端連接,不需要開多個線程 2. 性能高 減少線程切換和上下文開銷,CPU 利用率高 3. 編程簡單 所有命令在一個線程中順序執行,避免了加鎖和線程安全問題 4. 響應快 所有請求都是內存級操作,搭配非阻塞 I/O,響應非常迅速
📌統一回答:
Redis 的多路復用是一種基于 I/O 多路復用機制的事件驅動模型,它允許 Redis 在一個線程中同時監聽多個客戶端連接的讀寫事件。底層通過 epoll(Linux)、kqueue(macOS)等實現,從而做到高并發、高性能的處理請求。它的好處是減少資源占用、避免線程切換,同時保持了 Redis 命令的原子性和簡單性。