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服务未启动