下面我将从基础概念、不同环境的访问方式、代码示例和最佳实践四个方面来详细说明。
首先要明确,Redis 采用客户端-服务器(C/S)架构。
Redis 服务器一个持续运行的服务进程(redis-server
),监听一个端口(默认 6379),等待连接。
客户端你的应用程序服务器(如 Java、Python、Node.js 应用)就是客户端,它需要使用一个Redis 客户端库 来建立与 Redis 服务器的连接。
访问的本质是:应用程序(客户端)通过网络协议(TCP)向 Redis 服务器(服务端)发送命令并接收响应。
根据你的服务器和 Redis 实例的部署位置,访问方式主要有以下几种:
场景一:服务器与 Redis 在同一台机器上(本地访问)
这是最简单的场景,通常在开发环境中使用。
连接地址127.0.0.1
或localhost
端口6379
(默认端口)
优势网络延迟极低,无需担心网络安全策略。
配置Redis 默认配置即可访问,但需要确保bind
配置项允许本地连接(默认是127.0.0.1
)。
场景二:服务器与 Redis 在同一内网中(经典服务器架构)
这是生产环境中最常见的架构,例如应用服务器和 Redis 服务器是两台独立的云服务器,但处于同一个 VPC(虚拟私有云)或局域网内。
连接地址Redis 服务器的内网 IP 地址(例如192.168.1.100
)。
端口6379
。
优势内网传输,速度快,延迟低,且不经过公网,安全性高。
配置
1. 在 Redis 配置文件redis.conf
中,需要修改bind
指令,绑定到内网 IP 或0.0.0.0
(允许所有 IP 连接,但需配合防火墙使用)。
bind 192.168.1.100 127.0.0.1 # 或者 bind 0.0.0.0
2. 如果设置了密码,需要配置requirepass
。
3. 确保服务器的防火墙(如 iptables、firewalld)或云服务商的安全组规则允许应用服务器访问 Redis 服务器的 6379 端口。
场景三:服务器通过公网访问 Redis(不推荐,除非必须)
警告:除非万不得已,否则不要将 Redis 暴露在公网,因为这会带来极大的安全风险(数据泄露、被植入挖矿程序等)。
如果必须使用,请务必采取严格的安全措施:
连接地址Redis 服务器的公网 IP 地址 或域名。
端口一个非默认端口(例如6380
),避免被端口扫描工具轻易发现。
安全措施
1.强密码:设置一个非常复杂的requirepass
密码。
2.端口伪装:修改默认端口port 6379
为一个不常见的端口。
3.防火墙限制:在安全组或防火墙中,只允许你的应用服务器公网 IP 访问 Redis 的端口,拒绝所有其他 IP。
4.SSL/TLS 加密(Redis 6.0+):如果客户端和服务器库都支持,启用 TLS 加密传输通道。
以下是在不同编程语言中使用客户端库连接 Redis 的简单示例。
Python (使用redis-py
库)
import redis 建立连接池(推荐使用连接池以提高性能) pool = redis.ConnectionPool( host='192.168.1.100', # Redis 服务器地址 port=6379, # Redis 服务器端口 password='your_strong_password_here', # 如果有密码 decode_responses=True # 将返回的 bytes 类型解码为 str ) r = redis.Redis(connection_pool=pool) 测试连接并执行命令 try: r.set('my_key', 'Hello, Redis!') value = r.get('my_key') print(value) # 输出:Hello, Redis! except Exception as e: print(f"连接或操作失败: {e}")
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; public class RedisExample { public static void main(String[] args) { // 使用连接池 JedisPool pool = new JedisPool("192.168.1.100", 6379); try (Jedis jedis = pool.getResource()) { // 如果有密码 // jedis.auth("your_strong_password_here"); jedis.set("my_key", "Hello, Redis from Java!"); String value = jedis.get("my_key"); System.out.println(value); // 输出:Hello, Redis from Java! } catch (Exception e) { System.out.println("连接或操作失败: " + e.getMessage()); } finally { pool.close(); } } }
Node.js (使用ioredis
库)
const Redis = require('ioredis'); // 创建 Redis 客户端 const redis = new Redis({ host: '192.168.1.100', // Redis 服务器地址 port: 6379, // Redis 服务器端口 password: 'your_strong_password_here', // 如果有密码 }); // 执行命令 async function testRedis() { try { await redis.set('my_key', 'Hello, Redis from Node.js!'); const value = await redis.get('my_key'); console.log(value); // 输出:Hello, Redis from Node.js! } catch (err) { console.error('连接或操作失败:', err); } finally { redis.quit(); // 关闭连接 } } testRedis();
1、使用连接池:避免为每个请求创建新的连接,使用连接池来管理复用连接,大大提高性能。
2、使用强密码:生产环境必须设置复杂密码 (requirepass
)。
3、绑定内网 IP:在redis.conf
中通过bind
指令限制可连接的 IP,不要轻易使用bind 0.0.0.0
。
4、防火墙/安全组:这是第一道防线,只允许必要的应用服务器 IP 访问 Redis 端口。
5、重命名或禁用危险命令:例如将FLUSHALL
、CONFIG
等命令重命名为一个难以猜测的字符串,防止误操作或恶意操作。
rename-command FLUSHALL "a_very_complex_name_that_nobody_guesses" rename-command CONFIG ""
6、以非 root 用户运行 Redis:降低被入侵后的权限风险。
7、考虑使用托管服务:如果不想自己维护 Redis 服务器,可以直接使用云服务商提供的 Redis 服务,如 AWS ElastiCache、Azure Cache for Redis、阿里云 ApsaraDB for Redis 等,它们通常内置了高可用、备份和安全管理功能。
服务器访问 Redis 的关键步骤是:
1、确定网络环境:判断是本地、内网还是公网访问。
2、配置 Redis 服务器:正确设置redis.conf
(bind
,port
,requirepass
)。
3、配置网络安全:设置防火墙/安全组规则。
4、在应用代码中:使用正确的连接参数(主机、端口、密码)和对应的客户端库进行连接和操作。
按照以上指南,你就可以安全、高效地在你的服务器上访问 Redis 了。
文章摘自:https://idc.huochengrm.cn/fwq/17456.html
评论
益谷秋
回复服务器通过使用Redis客户端库,如Python的redis-py,通过TCP/IP连接到本地或远程Redis服务器进行数据交互。