一、Redis 内存缓冲区
Redis 内存分为三块:数据内存、进程内存、缓冲区内存;缓冲区内存波动大,BigKey 容易引发内存溢出。
1. 复制缓冲区 repl_backlog_buf
- 作用:主从增量同步时,保存主节点写命令,从节点断线重连后,从这里补发命令,避免全量同步。
- 配置:
repl-backlog-size,默认 1MB - 风险:设置过小,从库断线后缓冲区命令被覆盖,触发频繁全量复制,拖垮主库性能。
2. AOF 缓冲区
- 作用:AOF 刷盘前的内存缓存,AOF rewrite 过程也会使用。
- 特点:不能设置容量上限,命令持续写入会不断占用内存。
3. 客户端缓冲区(输入 + 输出)
- 输入缓冲区 :接收客户端发来的命令,最大 1G,不可配置;大命令会撑爆输入缓冲区。
- 输出缓冲区 :Redis 返回数据给客户端的缓冲区,可配置
配置命令:
client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>| 参数 | 含义 | | ---- | ---- | | class | 客户端类型:normal 普通客户端 /replica 主从副本 /pubsub 订阅客户端 | | hard limit | 硬上限,缓冲区一旦超过该值,立刻断开客户端 | | soft limit + soft seconds | 软限制:缓冲区超过 soft limit,持续 soft seconds 秒之后,断开客户端 | 默认配置
client-output-buffer-limit normal 0 0 0 # 普通客户端,0代表关闭限制,不断开
client-output-buffer-limit replica 256mb 64mb 60 # 副本:硬256M,软64M,持续60s断开
client-output-buffer-limit pubsub 32mb 8mb 60 # 订阅:硬32M,软8M,持续60s断开
二、内存查看命令
info memory:查看内存整体指标(used_memory、used_memory_rss、峰值内存等)memory stats:查看内存分项统计,如复制缓冲区、aof 缓冲区、客户端内存占用。
三、Redis Cluster 集群六大问题
核心结论:主从 Sentinel 集群,单机就能万级 QPS,业务能满足就尽量不用 Redis Cluster 分片集群,集群引入很多额外问题。
① 集群完整性问题
- 默认配置:
cluster-require-full-coverage yes,任意一个哈希插槽 slot 不可用,整个集群停止对外服务。 - 优化:设置
cluster-require-full-coverage no,未故障的插槽可以继续对外提供服务,提升可用性。
② 集群带宽问题
集群节点之间持续互相 PING,PING 包携带插槽信息、集群状态;节点越多,PING 包体积越大,占用大量内网带宽。 解决办法:
- 不要搭建超大集群,节点不宜过多;业务量大就拆分成多个独立小集群,不要单集群无限扩容。
- 单台物理机不要部署过多 Redis 实例,避免争抢带宽。
- 合理调整
cluster-node-timeout。
③ 数据倾斜问题
- 哈希槽分配不均、大 key 全部落在同一个 slot,导致部分节点内存 / 压力远高于其他节点。
④ 客户端性能问题
客户端需要维护集群路由表、MOVED/ASK 重定向,增加客户端开销;需要智能客户端。
⑤ 命令兼容性问题
多 key 命令(mget、mset),要求所有 key 落在同一个 slot,跨槽多 key 命令直接报错,无法执行。
⑥ Lua 脚本 & 事务问题
Lua 脚本、事务,默认要求脚本内所有 key 必须在同一个哈希槽,跨 slot 会执行失败。
四、面试简答版(口述精简)
Redis 缓冲区分复制缓冲区、AOF 缓冲区、客户端缓冲区。复制缓冲区用于主从增量同步,默认 1M,太小会频繁全量同步。客户端输出缓冲区有软硬两道阈值,hard 超了直接断连,soft 是持续一段时间超限再断。
Redis Cluster 分片集群有六大缺陷:集群完整性(一个 slot 挂了整集群不可用,改参数部分可用)、节点间 PING 包带来带宽开销、数据倾斜、客户端路由开销、跨 slot 多 key 命令不支持、Lua 脚本事务多 key 限制。