loading响应表明redis正加载rdb/aof数据,客户端应轮询info检测loading:0、预检连接、适配白名单命令、驱动层剔除loading从节点,并捕获该响应触发熔断告警。

如果您尝试向 Redis 发送命令,但收到 LOADING Redis is loading the dataset in memory 响应,则表明该 Redis 实例正处于 RDB 或 AOF 数据加载阶段,此时绝大多数读写命令被拒绝。以下是客户端侧可立即执行的多种处理方式:
一、轮询检测 loading 状态并等待就绪
该方法通过周期性查询 Redis 状态,确认 loading 是否结束,避免盲目重试导致连接堆积或超时雪崩。适用于所有客户端语言,不依赖服务端配置变更。
1、使用 INFO 命令获取服务器状态信息。
2、解析返回内容,提取 loading: 字段值(1 表示加载中,0 表示已完成)。
3、若值为 1,则等待固定间隔(如 500ms),重复执行步骤 1–2。
4、当检测到 loading:0 后,恢复业务命令发送。
二、预检连接前主动探测 loading 状态
在建立新连接或复用连接前,先发送一个轻量级、允许在 loading 状态下执行的命令进行探活,避免将请求发往尚未就绪的节点。该方式可前置拦截失败,降低下游错误率。
1、连接 Redis 后立即发送 INFO replication 或 INFO server 命令。
2、检查响应是否包含 loading:1 字段。
3、若存在且值为 1,立即关闭当前连接,延迟后重试新连接或切换至其他可用节点。
4、若响应正常且无 loading 标识,或返回 loading:0,则标记该连接为“可服务”,进入业务流程。
三、适配 loading 白名单命令做降级交互
针对 Redis 6.0+ 且已启用 loading-process-commands yes 的实例,客户端可在 loading 阶段安全调用特定只读命令,实现监控、健康检查或状态感知,无需完全阻塞。
1、确认服务端版本 ≥ 6.0 并执行 CONFIG GET loading-process-commands 返回 yes。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
2、在 loading 状态下,仅允许发送白名单内命令:如 INFO、ROLE、CONFIG GET、CLIENT LIST、PING。
3、禁止发送任何访问数据结构的命令(如 GET、KEYS、SCAN、EXISTS),否则仍会返回 LOADING 错误。
4、将业务逻辑中对键存在性或值的强依赖,替换为基于 INFO loading 的状态判断 + 本地缓存/默认值兜底。
四、驱动层自动剔除 loading 中的从节点(读写分离场景)
在部署主从架构且客户端实施读写分离时,若从节点处于 loading 状态,其 master_link_status=err 且 flags=slave,但端口仍可达,易被负载均衡器误判为健康节点。需在客户端驱动中嵌入识别逻辑。
1、定期执行 INFO replication 获取从节点同步状态。
2、当同时满足 role:slave 和 master_link_status:err 时,判定该从节点正处于 loading 阶段。
3、将该节点从读节点列表中临时移除,并加入隔离队列。
4、每隔 3–5 秒重新探测一次,一旦 master_link_status:up 且 loading:0,则重新纳入可用读节点池。
五、捕获 LOADING 响应并触发熔断与告警
将 LOADING 视为一种明确的服务不可用信号,而非临时网络抖动,在客户端统一异常处理模块中进行识别、分类和响应,防止错误扩散。
1、在 Redis 客户端封装层中,对所有命令响应做字符串匹配,识别是否包含 LOADING 子串。
2、命中后立即记录日志,包含时间戳、节点地址、命令类型及持续时长(如已记录上次检测时间)。
3、若单节点连续 3 次返回 LOADING 且间隔小于 30 秒,触发客户端本地熔断,暂停对该节点的所有请求 60 秒。
4、同步上报指标至监控系统,标记为 redis_loading_stuck 事件,供 SRE 快速定位是否为 RDB 文件损坏、内存不足或 AOF 过大等底层问题。










