Hi~!這里是奮斗的明志,很榮幸您能閱讀我的文章,誠請評論指點,歡迎歡迎 ~~
🌱🌱個人主頁:奮斗的明志
🌱🌱所屬專欄:Redis
📚本系列文章為個人學習筆記,在這里撰寫成文一為鞏固知識,二為展示我的學習過程及理解。文筆、排版拙劣,望見諒。
Redis
- Redis Java使用 樣例 列表
- 一、引入依賴
- 二、配置端口轉發
- 從 Windows 開發機訪問 Linux 云服務器 Redis 的實現邏輯:
- 一、連接需求背景
- 二、核心問題與矛盾
- 三、解決方案原理:SSH 端口轉發(跳板機制)
- 四、完整流程拆解(結合流程圖)
- 1. 環境準備
- 2. SSH 端口轉發配置(關鍵步驟)
- 3. 驗證端口轉發是否生效
- 4. Java 代碼連接(開發階段)
- 1. Redis 底層通信基于 TCP
- 2. Jedis 連接字符串格式
- 方式一:標準 URL 格式(推薦)
- 方式二:傳統參數方式
- 3. 為什么需要 `tcp://`?
- 4. 常見誤區
- 5.總結
- 5. 生產環境注意事項
- 五、關鍵配置與避坑點
- 六、總結:安全訪問云服務器 Redis 的完整鏈路
Redis Java使用 樣例 列表
一、引入依賴
Java 操作 redis 的客戶端有很多. 其中最知名的是 jedis.
創建 maven 項目, 把 jedis 的依賴拷貝到 pom.xml 中
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.2.0</version>
</dependency>
二、配置端口轉發
從 Windows 開發機訪問 Linux 云服務器 Redis 的實現邏輯:
一、連接需求背景
我們在 Windows 開發機(IDE 寫 Java 代碼) 想操作 Linux 云服務器上的 Redis,但直接訪問有網絡障礙:
- 云服務器 Redis 默認限制:Redis 端口(如 6379)被防火墻保護,無法直接通過公網訪問(否則易被黑客入侵)。
- 本地網絡特性:Windows 開發機是內網環境(類似小區住宅,被 NAT 保護),無法直接暴露給公網。
→ 核心需求:安全訪問云服務器 Redis,同時不暴露 Redis 端口到公網。
二、核心問題與矛盾
直接開放 Redis 端口到公網 ≈ “給服務器開大門”,風險極高(Redis 無復雜認證時,黑客可暴力破解)。但開發又需要從 Windows 訪問,形成矛盾:
三、解決方案原理:SSH 端口轉發(跳板機制)
利用 SSH 協議的端口轉發功能,把云服務器的 Redis 端口(如 6379)映射到本地 Windows 的某個端口(如 8888),實現 “間接訪問”。
- 類比:SSH 是 “安全通道”,把云服務器的 Redis 端口 “搬” 到本地,Windows 訪問
127.0.0.1:8888
≈ 訪問云服務器的6379
。
四、完整流程拆解(結合流程圖)
以下按 準備 → 配置 → 驗證 → 開發 步驟,配合流程圖詳細說明:
1. 環境準備
- 角色:
- Windows 開發機(內網,運行 IDE、SSH 客戶端)
- Linux 云服務器(公網 IP,運行 Redis、SSH 服務端)
- 前提:
- 云服務器已安裝 Redis(默認端口 6379,需配置
bind 0.0.0.0
和protected-mode no
允許內網訪問) - Windows 可通過 SSH 客戶端(如 XShell)連接云服務器
- 云服務器已安裝 Redis(默認端口 6379,需配置
2. SSH 端口轉發配置(關鍵步驟)
通過 SSH 客戶端(如 XShell)配置 本地端口轉發,把云服務器的 6379
映射到 Windows 的 8888
:
配置操作(以 XShell 為例):
- 新建 SSH 會話,連接云服務器。
- 會話屬性 → 連接 → SSH → 隧道 → 添加轉發規則:
- 源主機:
127.0.0.1
(本地回環地址) - 源端口:
8888
(本地監聽端口) - 目標主機:
127.0.0.1
(云服務器內訪問 Redis,因 Redis 綁定0.0.0.0
) - 目標端口:
6379
(Redis 實際端口)
- 源主機:
3. 驗證端口轉發是否生效
-
Windows 執行命令:
netstat -ano | findstr 8888
→ 說明本地 8888 端口已被 SSH 客戶端監聽,轉發規則生效。
4. Java 代碼連接(開發階段)
通過 Jedis
連接 本地映射端口 8888,間接操作云服務器 Redis:
public static void main(String[] args) {// 連接池指向本地 8888(實際映射到云服務器 6379)JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");try (Jedis jedis = jedisPool.getResource()) {// 測試連接(Redis 會返回 PONG)String pong = jedis.ping();System.out.println("Redis 響應: " + pong);}
}
在 Jedis 中使用 tcp://
前綴是因為 Redis 是基于 TCP 協議 進行通信的,這是 Jedis 連接字符串的標準格式。具體原因如下:
1. Redis 底層通信基于 TCP
- Redis 服務器默認監聽 TCP 端口(如 6379),客戶端與服務器通過 TCP 套接字 進行通信。
- Jedis 作為 Redis 的 Java 客戶端,本質上是通過 TCP 協議 發送 Redis 命令并接收響應。
2. Jedis 連接字符串格式
Jedis 支持兩種方式指定連接地址:
方式一:標準 URL 格式(推薦)
// 使用 "tcp://" 前綴明確指定 TCP 協議
JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");
-
tcp://
前綴:顯式聲明使用 TCP 協議連接 Redis。 -
優勢:支持完整的 URL 語法,可包含用戶名、密碼、數據庫索引等參數,例如:
// 帶認證和數據庫選擇的完整 URL JedisPool pool = new JedisPool("redis://user:password@host:port/0");
方式二:傳統參數方式
// 等價寫法,不使用 URL 格式
JedisPool jedisPool = new JedisPool("127.0.0.1", 8888);
- 本質:內部仍通過 TCP 連接,只是省略了
tcp://
前綴。
3. 為什么需要 tcp://
?
-
明確協議類型
:Redis 也可通過 Unix Socket 通信(需使用unix://前綴),例如:
// 通過 Unix Socket 連接(本地服務器專用) JedisPool pool = new JedisPool("unix:///path/to/redis.sock");
-
兼容性:URL 格式更靈活,支持未來擴展(如 SSL/TLS 加密連接,使用
rediss://
前綴)。
4. 常見誤區
- 誤以為 Redis 用 HTTP:Redis 協議是自定義的二進制協議(RESP),不基于 HTTP,因此不能用
http://
前綴。 - 省略前綴是否可行:對于 TCP 連接,
tcp://
可省略,但建議保留以提高代碼可讀性。
5.總結
JedisPool("tcp://127.0.0.1:8888")
中的 tcp://
是為了:
- 明確指定使用 TCP 協議 連接 Redis。
- 遵循 Jedis 的 URL 連接字符串規范。
- 與其他協議(如 Unix Socket、SSL)的連接方式統一語法。
等價寫法對比:
// 推薦:顯式指定 TCP 協議
JedisPool pool1 = new JedisPool("tcp://localhost:6379");// 等價:省略 tcp:// 前綴
JedisPool pool2 = new JedisPool("localhost", 6379);
兩者效果完全相同,但使用 tcp://
可讓代碼更清晰地表達 “通過 TCP 協議連接 Redis” 的意圖。
5. 生產環境注意事項
開發階段通過 SSH 轉發調試后,生產環境需調整連接邏輯:
- Java 程序直接部署到云服務器時,連接地址改為
localhost:6379
(無需端口轉發)。 - 若需公網訪問,應通過 Redis 安全配置(如密碼、IP 白名單)替代直接開放端口。
五、關鍵配置與避坑點
-
Redis 服務器配置(云服務器)
- 修改
redis.conf
:
bind 0.0.0.0 # 允許所有IP訪問(或指定云服務器內網IP) protected-mode no # 關閉保護模式(否則跨主機無法訪問) requirepass yourpassword # 建議設置密碼,增強安全
- 重啟 Redis 生效:
service redis-server restart
2.SSH 轉發的 “臨時性”
- 修改
-
SSH 連接斷開后,端口轉發自動失效。需保持 SSH 會話連接(或配置后臺運行)。
3.端口沖突問題
-
本地 8888 端口若被占用,需換其他端口(如 8889),并同步修改代碼和 SSH 轉發規則。
-
Redis服務未啟動