⚡ Redis 连接资源数据结构

一个 TCP 连接在 Redis 服务端对应的完整内存对象模型

① 核心结构体 — redisClient(client)
网络 / IO 相关
协议解析
状态 / 元信息
执行上下文

int
fd
TCP 套接字文件描述符,操作系统内核分配
-1 表示 fake client(AOF 加载用)
connection *
conn
封装 fd 的连接对象,含 TLS/普通 TCP 两种实现
包含 read/write handler 函数指针
sds
querybuf
接收缓冲区(动态字符串),存放未解析的原始字节
超过 client-query-buffer-limit (1GB) 会被强制关闭
size_t
querybuf_peak
接收缓冲区历史峰值,用于诊断内存占用
int
argc / argv[]
已解析的 RESP 命令参数个数与参数数组
argv 是 robj* 指针数组,指向共享对象或新建对象
struct redisCommand *
cmd / lastcmd
当前/上一条命令指针,指向命令表中的函数
list *
reply
发送响应链表,每个节点是一个 clientReplyBlock
当 buf 写满后溢出到此链表
char[]
buf[PROTO_REPLY_CHUNK_BYTES]
静态发送缓冲区(默认 16KB)
小响应直接写入此处,避免链表分配
uint64_t
id
全局自增连接 ID,CLIENT LIST 可见
redisDb *
db
当前 SELECT 的数据库指针(默认 db[0])
sds
name
CLIENT SETNAME 设置的连接名称
time_t
lastinteraction
上次交互时间,用于 timeout 检测
uint64_t
flags
状态位掩码:SLAVE / PUBSUB / BLOCKED
MULTI / READONLY / CLOSE_ASAP 等
multiState
mstate
MULTI/EXEC 事务队列,存储排队命令
list *
watched_keys
WATCH 监视的 key 列表,用于 CAS 事务
dict *
pubsub_channels
订阅的频道哈希表(Pub/Sub)
② 单条连接的内存区域分布
内核空间(Kernel Space)
Socket 接收缓冲区(sk_rcvbuf)
Socket 发送缓冲区(sk_sndbuf)
fd(文件描述符表)
TCP 状态机 / 序号 / ACK
用户空间 — 堆(Heap)
client 结构体(zmalloc 分配)
querybuf(SDS 动态字符串)
reply 链表节点(clientReplyBlock)
argv 数组 + robj 对象
name、pubsub_channels、watched_keys…
用户空间 — 静态 / 栈
buf[16384](内嵌静态缓冲区)
事件循环注册(aeEventLoop)
epoll/kqueue 监听 fd 读写事件
③ 服务端如何管理所有连接 — 双向链表 × 哈希表

Redis server 维护两个全局结构追踪所有客户端: server.clients(双向链表,遍历用) 和 server.clients_index(哈希表,按 id 快速查找)

双向链表(listNode):
server.clients
head
client#1
fd=10, id=1
client#2
fd=11, id=2
client#3
fd=12, id=3
→ NULL
哈希表(clients_index,key=id, value=client*):
id=1client#1*
id=2client#2*
id=3client#3*
④ 一次命令请求的完整 IO 流程
客户端
send() RESP
TCP
内核缓冲区
sk_rcvbuf
epoll 触发
readQueryFromClient
read() → querybuf
processInputBuffer
RESP 解析
填充 argc/argv
processCommand
命令执行
调用 cmd.proc()
addReply
写入 buf/reply
等待可写事件
sendReplyToClient
内核发送缓冲
sk_sndbuf
TCP
客户端
recv() 响应
⑤ 客户端连接池(以 Jedis / go-redis 为例)
连接池核心参数
maxTotal最大连接数(默认8)
maxIdle最大空闲连接
minIdle最小空闲连接
maxWaitMillis借用超时时间
testOnBorrow借用前 PING 检测
连接池内部队列状态
conn#1 空闲
conn#2 使用中
conn#3 使用中
conn#4 空闲
等待请求 排队中×2
连接对象核心字段
socket / fdTCP 套接字
inputStream读取响应流
outputStream发送命令流
broken连接是否损坏标志
lastUsedAt最后使用时间
⑥ 连接相关重要配置参数(服务端)
maxclients
最大并发连接数,默认 10000。超出后新连接返回 "ERR max number of clients reached"
tcp-backlog
TCP 握手队列长度(默认511),高并发下需同步提高 somaxconn 内核参数
timeout
连接空闲超时(秒),0=永不超时;生产建议设 300,防止僵尸连接积累
tcp-keepalive
TCP KeepAlive 探测间隔(秒,默认300)。操作系统层面检测死连接
client-query-buffer-limit
单客户端接收缓冲上限(默认1GB),超出强制断开,防止单连接耗尽内存
client-output-buffer-limit
输出缓冲限制,分三类:normal / slave / pubsub。Pub/Sub 慢消费者超限会被强制断开
数据来源:Redis 源码 src/server.h (client struct) · src/networking.c