如何利用Redis发布订阅模式优化多级缓存更新?

陌雪小哥_6677

陌雪小哥_6677

2026-08-09

986人浏览

原创

不能自动更新本地缓存,因redis pub/sub仅传递无语义字符串消息,需手动解析type/key字段并调用invalidate()或put();推荐json消息含type、key、ts、v,用lettuce异步订阅,优先invalidate,配合ttl与定时扫描兜底。

如何利用redis发布订阅模式优化多级缓存更新?

不能靠 PUBLISH / SUBSCRIBE 自动更新本地缓存。它只发字符串,不带语义、不保送达、不记历史——你得自己解析消息、自己调 invalidate() 或 put()。

为什么不能直接用 SUBSCRIBE 触发 Caffeine/Guava 刷新

Redis 的 Pub/Sub 是纯通道,不是事件总线。它不区分“删除”还是“更新”,不携带业务上下文,也不保证消息不丢。你收到一条 "user:123",但不知道该删、该刷、还是该忽略;更没法知道这条消息是不是重复发的。

  • JedisPubSub 是阻塞式回调,必须扔进独立线程跑,否则主线程卡死
  • Lettuce 的 StatefulRedisPubSubConnection 支持异步监听,还能复用 Netty 连接池,更适合生产环境
  • 别用 PSUBSCRIBE 监听通配符 channel,比如 cache:* —— 一旦 channel 名膨胀,容易误触、抖动、甚至压垮连接数

消息体设计必须包含 type 和 key

只传 ID 或完整对象 JSON 都是典型翻车点。消息至少得有 type("DELETE" / "UPDATE")和 key("user:456"),否则本地缓存根本无法决策。

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • 避免只传原始数字 "456":不同服务对同一 ID 解释可能冲突(是用户 ID?订单 ID?)
  • 别序列化整个对象发过去:网络开销大,且本地缓存往往只需要 invalidate,不需要全量数据
  • 必须加 ts(时间戳)或 v(版本号):断线重连后收到旧消息,或网络重复投递,没判重逻辑就会反复刷新甚至写入脏数据
  • 推荐格式:{"type":"DELETE","key":"user:456","ts":1718234567,"v":"2"}

收到消息后该 invalidate 还是 refresh

选 invalidate(),别一收到就查 DB 再 put()。这不是偷懒,是防雪崩、防脏写、保延迟可控。

  • 多个实例同时收到同一条 UPDATE 消息,如果都去查 DB,瞬间并发打穿数据库
  • DB 查询慢、超时或报错时,put(null) 或 put(old_value) 会污染本地缓存
  • invalidate() 后,下一次请求自然触发加载,配合 Caffeine 的 refreshAfterWrite 或 expireAfterAccess 就够用
  • 如果业务对“首次访问延迟”敏感,可搭配预热策略,而不是在通知里硬塞 DB 查询逻辑

多实例怎么确保都收到通知

每个服务实例起一个独立连接,都 SUBSCRIBE 到同一个 channel(比如 cache-invalidate),Redis 天然支持广播。但现实约束很硬:

  • 连接断开期间的消息完全丢失:没 ack、没 offset、不支持断线重连后补推
  • 线上建议搭配心跳 + 定期全量校验:比如每小时扫一次 Redis 热 key,比对本地缓存是否存在/是否过期
  • 不要指望 Pub/Sub 做最终一致性兜底,它只是轻量级实时通知层;强一致场景必须走 Canal 或双写 + 补偿

真正难的不是写几行 PUBLISH,而是消息体怎么设计、断线怎么兜底、重复怎么判重、以及什么时候该放弃 Pub/Sub 改用更可靠的方案。这些细节不处理好,缓存不一致问题只会从“偶尔出现”变成“稳定复现”。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

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

相关专题

更多
常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4489

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

4035

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

7492

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

643

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

756

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

7362

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1160

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1096

6

redis主要作用有哪些
redis主要作用有哪些

redis 的主要作用包括:1. 缓存数据,提高访问速度;2. 充当消息队列,实现消息传递;3. 存储各种数据类型,如字符串、散列和集合;4. 管理会话信息,确保可靠性和可用性;5. 限制请求速率,防止服务器超载等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

6438

6

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习