讲师中心 微信公众号
AI工具推荐 视频效率加速

Redis怎样利用发布订阅机制更新多级本地缓存

秋宇小哥_5186

秋宇小哥_5186

发布时间:2026-03-14 11:03:11

|

325人浏览过

|

来源于php中文网

原创

不能。Redis发布订阅仅传递字符串消息,无数据语义与可靠性保障,需手动解析消息并调用本地缓存的invalidate/put方法;多实例通过各自订阅同一channel实现通知,但存在断线丢消息等问题。

redis怎样利用发布订阅机制更新多级本地缓存

Redis 发布订阅能直接更新本地缓存吗?

不能。Redis 的 PUBLISH 和 SUBSCRIBE 是纯消息通道,不带数据结构语义,也不保证送达、不支持重放、不记录历史——它只负责把字符串消息“扔出去”。你不能靠它自动刷新 guava cache 或 Caffeine 里的某个 key,更没法触发 Spring Cache 的 @CacheEvict。

真正可行的路径是:用订阅收到消息 → 解析出变更的业务标识(比如 "user:123")→ 主动调用本地缓存的 invalidate() 或 put() 方法。

怎么让多个服务实例都收到缓存失效通知?

靠 Redis 的 PUB/SUB 天然支持多消费者:每个服务实例起一个独立的 Connection 并 SUBSCRIBE 到同一个 channel(比如 cache-invalidate),消息一发,所有在线 subscriber 都会收到。

但要注意几个现实约束:

  • 连接断开期间的消息完全丢失 —— 没有 ack,没有 offset,不支持断线重连后补推
  • 如果用 Jedis,JedisPubSub 是阻塞式回调,必须在单独线程里跑,否则卡死主线程
  • Lettuce 更合适,它的 StatefulRedisPubSubConnection 支持异步监听,还能复用 Netty 连接池
  • 别用通配符 PSUBSCRIBE 做通用监听,channel 名设计要收敛(如 cache:user、cache:order),避免误触和性能抖动

消息体该怎么设计才不容易翻车?

最简方案是传 JSON 字符串,但必须包含两个字段:type(操作类型,如 "DELETE" 或 "UPDATE")和 key(对应本地缓存的 key,如 "user:456")。别省略 type —— 否则无法区分是删还是刷,也难做幂等。

常见错误包括:

  • 只传原始 ID(如 "456"),导致不同 service 对同一 ID 解释不一致(用户 ID 还是订单 ID?)
  • 把完整对象序列化后发过去,徒增网络压力,且本地缓存可能根本不需要全量数据
  • 没加时间戳或版本号,遇到重复消息时无法判重,引发缓存反复刷新甚至错乱

建议格式:

{"type":"DELETE","key":"user:456","ts":1718234567,"v":"2"}

本地缓存更新时机选 invalidate 还是 refresh?

优先选 invalidate(即删掉本地缓存项),而不是收到消息后立刻查 DB 再 put。原因很实在:

  • 避免雪崩:多个实例同时收到同一条消息,若都去查 DB,瞬间并发打穿数据库
  • 避免脏写:如果 DB 查询慢、超时或报错,put 可能写入 null 或旧值,污染缓存
  • 延迟可控:下一次请求自然触发加载,配合本地缓存的 refreshAfterWrite 或 expireAfterAccess 就够用

只有极少数场景适合主动 refresh:比如该 key 被高频访问、且 DB 查询极快(毫秒级)、且你能确保各实例不会同时发起加载(例如加分布式锁或用 Caffeine 的 refreshAfterWrite + 异步 load)。

复杂点在于:消息可能比 DB 写入还快(尤其是主从延迟时),所以 invalidate 后首次加载仍可能读到旧值。这个 gap 无法靠发布订阅消除,得靠业务容忍或额外机制(如延迟双删、binlog 监听)来缓解。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2511

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

457

2026.01.26

什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

2013

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

3014

2023.10.07

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2095

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3162

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1076

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3599

2025.09.10

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

0

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn