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

怎么用Redis做配置广播_监听PubSub通道实时更新配置

浅婷酱_8732

浅婷酱_8732

发布时间:2026-06-30 09:14:19

|

837人浏览过

|

来源于php中文网

原创

Redis Pub/Sub不能自动监听key变更,必须业务侧显式publish;keysapce通知需手动开启、不持久、无新值、难通配且易引发性能问题;推荐用专用channel+显式publish并携带完整上下文。

怎么用redis做配置广播_监听pubsub通道实时更新配置

Redis 的 Pub/Sub 本身不能直接监听配置变更,必须由业务侧主动 publish,否则订阅端永远收不到更新。 它不是“自动监听 key 变化”的机制,而是一个需要你显式触发消息发布的通信通道。这点不厘清,后续所有逻辑都会卡在“为什么改了 Redis 值却没通知”上。

为什么 __keyspace@0__:my_config 不适合做配置广播

键空间通知(Keyspace Notification)确实能捕获 SET、DEL 等操作,但它有硬伤:

  • 默认关闭,需手动执行 CONFIG SET notify-keyspace-events Exg(E 表示键事件,x 是过期,g 是通用命令),且该设置不持久,Redis 重启后失效
  • 通知内容只有事件类型(如 set)和 key 名,**不带新值**——你得自己再 GET 一次,多一次网络往返,还可能被并发覆盖
  • 频道名含数据库编号(如 @0),换库或用集群时容易错配;且无法通配多个配置 key(比如 my_config_*)而不暴露全部 key 事件
  • 生产环境开启后会产生大量无关事件(比如缓存 key 过期),增加 pubsub 消费压力

真正可用的配置广播:用专用 channel + 显式 publish

把配置更新变成一个“发布动作”,而非“被动监听 key”。这是稳定、可控、可追溯的做法:

  • 所有配置写入统一走封装函数,比如 update_config(key, value),内部先 SET key value,再 PUBLISH config_update {"key":"my_config","value":"new_val"}
  • 订阅端只监听固定频道(如 config_update),收到消息后解析 JSON,按 key 更新本地内存缓存或触发 reload
  • 消息体必须包含完整上下文:key、value、timestamp、甚至 version 或 source(哪个服务发的),方便幂等与调试
  • 避免用 PUBSUB NUMSUB config_update 查在线订阅数来判断是否“已送达”——Pub/Sub 无确认机制,离线期间消息直接丢失

Python 示例:安全启动订阅并防阻塞

别用 pubsub.listen() 阻塞式循环,它会让整个线程卡死。改用非阻塞 get_message() + 心跳保活:

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

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

下载
import redis
import json
import time
<p>r = redis.Redis(host='localhost', port=6379, db=0)
p = r.pubsub()
p.subscribe('config_update')</p><h1>启动后先拉一次当前值,避免启动间隙丢失</h1><p>current = r.get('my_config')
if current:
print(f"初始配置: {current.decode()}")</p><p>while True:
msg = p.get_message(ignore_subscribe_messages=True, timeout=1.0)
if msg and msg['type'] == 'message':
try:
data = json.loads(msg['data'])
if data.get('key') == 'my_config':
print(f"收到更新: {data['value']}")</p><h1>此处更新本地变量或触发 reload</h1><pre class="brush:php;toolbar:false;">    except (json.JSONDecodeError, KeyError):
        pass  # 跳过非法消息
# 每秒检查一次,避免长连接超时断开
time.sleep(0.1)

注意 ignore_subscribe_messages=True 过滤掉订阅成功的系统消息;timeout=1.0 让 get_message() 不永久等待;循环内 time.sleep(0.1) 是防 CPU 空转的关键。

上线前必须验证的三个点

配置广播最容易出问题的地方不在代码,而在部署协同:

  • 确保所有实例订阅的是**同一个频道名**,大小写、下划线、空格都要一致——config:update 和 config_update 是两个频道
  • 发布方和订阅方的 Redis 连接必须指向**同一实例或同一分片**(集群模式下,Pub/Sub 不跨节点转发)
  • 如果用 Docker 或 K8s,确认容器间网络策略允许 Redis 端口(默认 6379)双向通信,尤其是 subscribe 端要能连上 Redis 的 pubsub 连接

最常被忽略的是:没有为配置更新设计降级路径。当 Redis 不可用或频道中断时,程序不能停摆——本地应保留一份最近成功加载的配置副本,并设置最长容忍失效时间(如 5 分钟),超时后告警但继续用旧值运行。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

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

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

讯飞绘文

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

WorkBuddy

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

豆包大模型

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

音述AI
音述AI Hot

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

DeepSeek

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

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

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

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

4289

2023.11.02

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

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

3775

2023.11.14

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

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

6832

2024.04.02

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

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

623

2024.04.07

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

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

736

2024.04.07

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

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

6442

2024.04.07

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

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

1140

2024.04.07

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

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

1016

2024.04.07

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

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

精品课程

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

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习

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

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