首页/数据/Redis 进阶速查/背压:下游慢时的自我保护
性能与排障129 条

背压:下游慢时的自我保护

当 Redis 变慢,上游若无背压会不断堆积:用有界队列、入口限流、熔断降级(本地缓存兜底)把压力挡在业务之外。

Redis 进阶速查数据更新于 2026-10-13

背压是什么

背压是把不可控的堆积变成可控的拒绝。下游变慢时,上游若无背压就会不断堆积:请求排队、内存上涨、超时触发重试,压力被进一步放大,最终应用比 Redis 先崩。做法是在入口限流、用有界队列替代无界队列、必要时熔断并降级到本地缓存或默认值,同时把拒绝数量纳入监控。

基本信息

核心手段有界队列、入口限流、熔断降级
降级方式本地缓存或默认值兜底
观测项队列长度、拒绝数量、降级比例
设计原则把不可控的堆积变成可控的拒绝
配套动作超时与重试策略同时收紧

典型使用场景

  • 突发流量:入口限流把超出容量的部分挡在业务之外
  • 依赖故障:下游不可用时熔断,避免请求堆积拖垮自身
  • 缓存击穿:降级到本地缓存或默认值,保证核心链路可用
  • 批任务与在线混跑:给批任务单独队列,避免互相挤占
  • 容量评估:用拒绝量反推真实需求,作为扩容依据

落地要点示意

落地要点示意
# 队列有界:满时立即失败并返回降级结果
# 入口限流:按 QPS 上限控制放行量
# 熔断:连续失败达到阈值后快速失败一段时间
# 观测:拒绝量、队列长度、降级比例都进监控
# 恢复:熔断进入半开状态探测,确认下游可用后再放量

落地检查项

检查项要求不满足的后果
队列是否有界满了快速失败无界队列吃光内存,应用先崩
拒绝是否计数进监控与告警容量问题长期无人发现
降级是否有标记返回体带降级标识业务把默认值当真值使用
熔断能否恢复半开探测后自动恢复长期熔断导致能力闲置
背压的目标不是拒绝请求,而是让系统在过载时仍能保住核心链路:非核心功能先降级,核心交易的资源优先保证。
降级返回的数据若不标记,业务侧会把默认值当真实数据继续计算,事后对账困难;降级标识要同时体现在接口返回值与日志里。

易错点

  • 使用无界队列:请求堆积吃光内存,应用先于 Redis 崩溃
  • 降级数据不标记:业务把默认值当真值使用,数据一致性问题延后爆发
  • 只加限流不做重试治理:客户端重试把被限流的流量成倍放大
  • 拒绝量不监控:容量不足长期无人发现,每次高峰都要人工救火

数据来源与参考

  • Redis 官方实践:韧性设计
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌