当前位置:首页 > 文章列表 > 数据库 > Redis > Redis 客户端缓存怎样使用广播失效

Redis 客户端缓存怎样使用广播失效

来源:17golang原创 2026-10-15 01:14:28 0浏览 收藏

Redis 客户端缓存开启广播失效时,核心命令是 CLIENT TRACKING ON BCAST PREFIX ...。它不让 Redis 记录每个客户端读过的全部 key,而是让客户端声明自己关心的 key 前缀;匹配前缀的 key 被修改时,Redis 向订阅该前缀的客户端发送失效通知。

官方地址:https://redis.io/docs/latest/develop/reference/client-side-caching/

想用好 BCAST,先把客户端缓存的 key 设计成互不重叠的业务前缀,再确认失效连接确实收到了通知。前缀越宽,收到的消息越多;完全不写 PREFIX 则会把所有被修改的 key 都纳入通知范围。

规模背景:为什么要从逐 key 跟踪转向广播

Redis 的客户端缓存有两种不同的服务端取舍:普通 tracking 记录客户端可能缓存过哪些 key,修改时只通知相关客户端;BCAST 不维护这张按 key 记录的失效表,而是按前缀广播。因此,BCAST 可以减少 Redis 为每个客户端保存 key 关系的内存,但会把匹配前缀的变更通知给该前缀的所有订阅者。

如果客户端数量较多、缓存 key 的访问组合不断变化,或者服务端不希望长期维护大量 key 到客户端的关联,BCAST 更容易管理。它的代价也很明确:前缀越宽,客户端越容易收到自己没有缓存的失效消息;注册的前缀很多时,Redis 处理前缀匹配的 CPU 成本也会上升。

现象优先检查通常的动作
缓存很少失效PREFIX 是否覆盖真实 key,失效连接是否在线收窄并校准 key 前缀,断线时清空本地缓存
通知数量过多PREFIX 是否过宽,是否省略了 PREFIX拆成稳定且不重叠的业务前缀
配置直接被拒绝多个 PREFIX 是否互相包含删除冗余前缀,只保留更宽的一个或改名

新架构:用 BCAST 与 PREFIX 组织失效通知

先把数据连接与接收失效通知的连接分开描述,避免把“发起查询的连接”和“接收失效消息的连接”混为一谈。下面的命令只展示配置形态,实际客户端需要把返回的通知解析成要删除的本地缓存条目。

# 为接收失效通知的连接取得客户端 ID
redis-cli CLIENT ID

# 在数据连接上启用广播模式,只关注两个业务前缀
redis-cli CLIENT TRACKING ON BCAST PREFIX user: PREFIX order:

# 数据连接读取带前缀的 key,客户端可以把返回值放入本地缓存
redis-cli GET user:42
redis-cli GET order:9001
Redis BCAST 按 PREFIX 将键变更广播到客户端本地缓存的静态结构图
图1:BCAST 广播路由说明图,观察前缀匹配键如何向订阅客户端发送失效通知。

RESP3 可以在同一连接上承载数据回复与失效 push 消息;RESP2 常见做法是用一个连接取数据、另一个连接接收通知,并通过客户端 ID 做重定向。无论采用哪种连接模型,应用都必须真正消费失效消息并删除对应的本地缓存,否则 Redis 发出了通知,应用仍可能继续返回旧值。

关键取舍:前缀重叠、空前缀与连接断线

BCAST 的 PREFIX 不是普通的标签列表,而是 key 空间的匹配边界。Redis 官方文档明确限制:两个前缀不能覆盖重叠的 key 空间。例如 foo 和 foob 都会匹配 foobar,因此不应同时注册。只保留 foo 已经足够覆盖这段空间。

# 推荐:两个业务前缀互不包含,边界更容易解释
redis-cli CLIENT TRACKING ON BCAST PREFIX user: PREFIX order:

# 反例:foo 与 foob 存在重叠,容易被 Redis 拒绝或造成设计误解
# redis-cli CLIENT TRACKING ON BCAST PREFIX foo PREFIX foob

# 不写 PREFIX 等同于空前缀,会扩大到所有被修改的 key
# redis-cli CLIENT TRACKING ON BCAST
Redis BCAST 中不重叠前缀与重叠前缀的静态边界对比图
图2:PREFIX 边界说明图,对比不重叠前缀与重叠前缀的配置结果。

实际设计时,先列出会进入本地缓存的 key 命名空间,再决定前缀。比如只缓存用户资料和订单摘要,可以使用 user: 与 order:;如果团队既有 user: 又有更细的 user:profile:,后者已经被前者覆盖,就不必同时注册。

没有收到通知:先查覆盖范围与连接状态

先确认发生变化的完整 key 是否以已注册 PREFIX 开头。例如监听 user: 时,修改 profile:42 不会触发该前缀的广播。再确认接收通知的连接没有断开;一旦失效连接丢失,客户端应清空本地缓存并重新建立订阅,而不是继续相信旧副本。

通知过多:收窄前缀,不要先在客户端静默丢弃

如果监听了空前缀,所有被修改的 key 都可能进入通知范围;如果用了 app: 这样的宽前缀,业务下的计数器、临时状态和高频写 key 也会被带上。优先按稳定的业务对象重新命名或拆分前缀,让 Redis 在源头缩小广播范围。

缓存仍然返回旧值:检查消息处理而非只检查 Redis

BCAST 只负责发失效消息,不替应用删除本地对象。收到通知后,客户端要按 key 删除缓存;如果采用异步处理,还要考虑通知到达与读请求之间的竞态。稳妥的策略是:读请求开始时标记加载中,收到失效通知就删除或标记过期,返回新值后只有在条目仍有效时才写回本地缓存。

上线结果:观察通知量和缓存新鲜度

  • 数据连接确实执行了 CLIENT TRACKING ON BCAST,没有误用普通 tracking 或把参数发到了错误连接。
  • 每个 PREFIX 都对应真实的本地缓存 key,且没有两个前缀互相包含。
  • 确认省略 PREFIX 的影响:空前缀会扩大通知范围,不应把它当成“默认关闭过滤”。
  • 失效连接断开时会清空本地缓存,并在重连后重新建立 tracking 配置。
  • 应用会消费通知并删除本地 key;只记录通知而不清理缓存,不能解决脏读。
  • 观察通知量和前缀数量,避免用过宽前缀换来不可控的客户端处理压力。

后续改进:把命名空间和断线恢复固化

BCAST 会让 Redis 为每个客户端保存访问过的 key 吗?

不会。BCAST 的设计是不维护普通 tracking 那种按客户端记录 key 的失效关系,而是维护前缀与客户端的关联;代价转移到了前缀匹配和广播消息数量。

两个 PREFIX 可以一个是另一个的开头吗?

不建议,也不应这样配置。只要两个前缀会匹配同一段 key 空间,就属于重叠;例如 foo 与 foob 会同时匹配 foobar,保留更宽的前缀即可。

客户端断线重连后,原来的本地缓存还能继续用吗?

不能直接信任。失效通知连接中断期间可能漏掉变更,重连时应清空本地缓存并重新启用 tracking,再逐步填充新的副本。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Redis GEOSEARCH 怎样限制矩形范围Redis GEOSEARCH 怎样限制矩形范围
上一篇
Redis GEOSEARCH 怎样限制矩形范围
Redis BLMOVE 超时后怎样判断源列表状态
下一篇
Redis BLMOVE 超时后怎样判断源列表状态
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    474次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    532次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    552次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    505次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    324次使用