redis--主从还是集群,内存

一、Redis 内存缓冲区

Redis 内存分为三块:数据内存、进程内存、缓冲区内存;缓冲区内存波动大,BigKey 容易引发内存溢出。

1. 复制缓冲区 repl_backlog_buf

  • 作用:主从增量同步时,保存主节点写命令,从节点断线重连后,从这里补发命令,避免全量同步。
  • 配置:repl-backlog-size,默认 1MB
  • 风险:设置过小,从库断线后缓冲区命令被覆盖,触发频繁全量复制,拖垮主库性能。

2. AOF 缓冲区

  • 作用:AOF 刷盘前的内存缓存,AOF rewrite 过程也会使用。
  • 特点:不能设置容量上限,命令持续写入会不断占用内存。

3. 客户端缓冲区(输入 + 输出)

  1. 输入缓冲区 :接收客户端发来的命令,最大 1G,不可配置;大命令会撑爆输入缓冲区。
  2. 输出缓冲区 :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 包体积越大,占用大量内网带宽。 解决办法:

  1. 不要搭建超大集群,节点不宜过多;业务量大就拆分成多个独立小集群,不要单集群无限扩容。
  2. 单台物理机不要部署过多 Redis 实例,避免争抢带宽。
  3. 合理调整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 限制。

相关推荐
百数平台1 小时前
低代码安全技术实践:表单 / 流程 / 报表三级权限体系设计解析
java·大数据·数据库
白露与泡影1 小时前
Spring Boot 实现验证码:Hutool-captcha、AJ-Captcha、EasyCaptcha 到底怎么选?
java·spring boot·后端
驭渊的小故事1 小时前
MyBatis-Plus 实战指南:从基础 CRUD 到条件构造器与自定义 SQL(二)
数据库·sql·mybatis
马优晨1 小时前
Java中的dto是什么
java·开发语言·java中的dto是什么·java的dto是什么·dto在java中是什么
小蒜学长1 小时前
基于Springboot+Vue的高校教师教学业绩综合管理系统的设计与开发(代码+数据库+LW)
java·数据库·spring boot·后端·教学业绩管理·三级权限
Mikko71 小时前
Spring Boot 3.5.16 自带的 Tomcat 10.1.55 中了哪些 CVE?其中一条是修上一个漏洞时带进来的
java·spring boot·后端·安全·tomcat
十年Java程序媛1 小时前
Java 内部类全解|成员 / 静态 / 匿名内部类,理清和 Lambda 的区别
java·spring boot·面试
霸道流氓气质1 小时前
AI 简历制作平台:结构化输出解析、多模板渲染与 PDF 导出的 Vue3 + Spring AI 全栈实战
人工智能·spring·pdf
SL_staff1 小时前
报工≠打卡:从任务报工到闭环管控的5个数据断点排查清单
java·spring boot·全栈