Redis 连接

Redis 连接(Connection)完全攻略

“Redis 的命脉” —— 理解连接原理、优化连接池、避免连接泄漏,性能提升 10 倍


一、Redis 连接核心概念

概念说明
TCP 连接Redis 基于 长连接,一次握手多次命令
连接生命周期CONNECT → AUTH → SELECT → 命令 → QUIT
最大连接数默认 无限,受 maxclients 限制
连接模式普通 / 订阅 / 事务 / 管道
连接状态idleactiveblocked

二、连接相关配置(redis.conf

配置默认值说明推荐
bind 127.0.0.1本地监听地址生产内网 IP
port 63796379端口自定义
timeout 00空闲超时(秒)300
tcp-keepalive 300300TCP 保活60
maxclients 1000010000最大客户端数CPU核 × 10000
client-output-buffer-limit见下客户端缓冲区调整

客户端缓冲区限制(防 OOM)

# 格式: normal {soft} {hard} {sec}
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

三、连接命令全表

命令说明示例
CLIENT LIST查看所有连接CLIENT LIST
CLIENT GETNAME获取连接名CLIENT GETNAME
CLIENT SETNAME name设置连接名CLIENT SETNAME web:1
CLIENT ID当前连接 IDCLIENT ID
CLIENT KILL addr:port断开指定连接CLIENT KILL 127.0.0.1:12345
CLIENT PAUSE timeout暂停所有客户端CLIENT PAUSE 1000
CLIENT REPLY ON|OFF|SKIP控制回复CLIENT REPLY OFF
CLIENT INFO当前连接信息CLIENT INFO

四、连接状态详解(CLIENT LIST 输出)

id=5 addr=127.0.0.1:54321 fd=8 name=web:1 age=120 idle=0 flags=N
字段说明
id连接唯一 ID
addr客户端 IP:端口
fd文件描述符
name连接名(CLIENT SETNAME
age连接存活时间(秒)
idle空闲时间(秒)
flags状态标志:N=普通,S=从库,P=Pub/Sub,M=Monitor

五、连接池(Connection Pool)最佳实践

为什么需要连接池?

创建连接 → TCP 3次握手 → 慢!
复用连接 → 零开销 → 快!

连接池参数推荐

参数推荐值说明
max_totalCPU核 × 100总连接数
max_idleCPU核 × 20空闲连接
min_idleCPU核 × 5最小空闲
max_wait100ms获取连接超时
test_on_borrowtrue借出时校验
test_on_returnfalse归还时不校验

六、客户端连接代码示例

Python (redis-py + 连接池)

import redis

# 创建连接池
pool = redis.ConnectionPool(
    host='127.0.0.1',
    port=6379,
    password='your_password',
    max_connections=20,
    socket_timeout=5,
    socket_connect_timeout=5,
    retry_on_timeout=True,
    health_check_interval=30
)

# 复用连接池
r = redis.Redis(connection_pool=pool)

# 设置连接名
r.client_setname('web:worker:1')

# 使用
r.set('key', 'value')

Java (Jedis + 连接池)

JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50);
config.setMaxIdle(10);
config.setMinIdle(5);
config.setTestOnBorrow(true);

JedisPool pool = new JedisPool(config, "localhost", 6379, 5000, "password");

try (Jedis jedis = pool.getResource()) {
    jedis.clientSetname("api:service:1");
    jedis.set("key", "value");
}

Go (go-redis)

rdb := redis.NewClient(&redis.Options{
    Addr:         "localhost:6379",
    Password:     "password",
    DB:           0,
    PoolSize:     20,
    MinIdleConns: 5,
    DialTimeout:  5 * time.Second,
    ReadTimeout:  3 * time.Second,
    WriteTimeout: 3 * time.Second,
    PoolTimeout:  5 * time.Second,
})

rdb.ClientSetName(context.Background(), "go:worker:1")

七、连接优化技巧

技巧说明
设置连接名CLIENT SETNAME 便于监控
短连接 → 长连接复用连接
连接池预热启动时创建 min_idle 连接
超时设置socket_timeoutconnect_timeout
心跳检测PING 每 30 秒
关闭 CLIENT REPLY OFF订阅模式下使用
# 心跳
def heartbeat(r):
    while True:
        r.ping()
        time.sleep(30)

八、连接问题排查

1. 连接数暴涨

CLIENT LIST | wc -l   # 当前连接数
INFO clients          # connected_clients

原因

  • 连接泄漏
  • 连接池配置过大
  • 订阅者未退出

解决

# 杀掉空闲 > 1小时的连接
CLIENT LIST | grep "idle=3600" | awk '{print $2}' | cut -d: -f1 | xargs -I {} CLIENT KILL {}

2. 连接超时

Error: Connection timed out

解决

  • 增大 socket_timeout
  • 检查网络延迟
  • 使用连接池

3. Too many open files

Error: Too many open files

解决

ulimit -n 65535
# redis.conf
maxclients 10000

九、一键速查表

# 连接管理
CLIENT LIST
CLIENT LIST | grep "idle=3600" | wc -l
CLIENT KILL 127.0.0.1:54321
CLIENT SETNAME web:1
CLIENT GETNAME

# 监控
INFO clients
INFO stats | grep connected

# 配置
timeout 300
tcp-keepalive 60
maxclients 20000

十、连接安全加固

# 1. 密码认证
requirepass your_strong_password

# 2. 禁用危险命令
rename-command FLUSHALL ""
rename-command CONFIG   "CONFIG_PROD"

# 3. 绑定内网
bind 10.0.0.10

# 4. TLS 加密(Redis 6.0+)
tls-port 6380
tls-cert-file /path/redis.crt
tls-key-file /path/redis.key

十一、生产级连接架构

graph TD
    A[应用服务] -->|连接池| P[Proxy]
    P[Sentinel / Cluster Proxy] --> R1[Redis 主]
    P --> R2[Redis 从]
    P --> R3[Redis 从]

推荐方案:

  • Sentinel 模式redis-sentinel + 连接池
  • Cluster 模式redis-cluster-proxy 或客户端智能连接
  • 连接池中间件Hiredis + Twemproxy

完成!你已精通 Redis 连接!

# 一行命令查看连接健康状态
redis-cli CLIENT LIST | awk '{print $2" "$5" "$6}' | sort

下一步推荐

  1. Redis Sentinel 高可用
  2. Redis Cluster 集群
  3. 连接池性能压测与调优

需要我送你

  • “企业级连接池配置模板(Java/Python/Go)”
  • “连接泄漏自动检测 + 告警脚本”
  • “Redis 连接监控大屏(Grafana)”

回复:连接池模板 | 泄漏检测 | 监控大屏 即可!

文章已创建 2481

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部