Redis订阅怎么让数据变化立刻被发现,键的订阅到底咋用
- 问答
- 2026-01-09 18:49:25
- 1
关于Redis订阅如何让数据变化立刻被发现,以及键的订阅到底怎么用,我们可以把它想象成一个“小区广播系统”和“门铃通知系统”的区别,理解了这两个比喻,你就明白核心了。
第一部分:Redis的发布/订阅(Pub/Sub)—— 小区广播系统
这个功能的目的就是为了实现你所说的“数据变化立刻被发现”,它的工作模式非常简单直接,就像电台广播。
-
角色有三个:
- 发布者(Publisher):负责发布消息的人,它不关心谁在听,只负责对着某个“频道”喊话。
- 频道(Channel):就是广播的频率或频道名称,新闻频道”、“体育频道”。
- 订阅者(Subscriber):想要接收消息的人,它需要先“调频”到感兴趣的频道,然后就能听到这个频道所有发布者说的话。
-
怎么用?(引用来源:Redis命令)
- 让一个客户端成为订阅者:使用
SUBSCRIBE命令,打开一个Redis命令行,输入SUBSCRIBE news,这个客户端就开始监听news这个频道了,它会进入一个等待状态,专门接收消息。 - 让另一个客户端发布消息:再打开一个Redis命令行,使用
PUBLISH命令,比如输入PUBLISH news "今天天气晴"。 - 立刻发生的事:在第一个订阅了
news频道的客户端里,你会立刻看到一条消息显示出来,内容就是“今天天气晴”,这个过程几乎是瞬间完成的。
- 让一个客户端成为订阅者:使用
-
核心特点(为什么能“立刻被发现”):
- 实时性:一旦消息被发布,所有订阅了该频道的客户端会同时收到,Redis服务器会主动把消息“推”给订阅者,而不是让订阅者不停地去“问”(轮询)。
- 无存储:发布的消息不会被Redis保存,如果某个订阅者中途才加入,它收不到它加入之前发布的消息,就像你打开收音机,只能听到现在正在播的,听不到一小时前的节目。
- 一对多:一个发布者可以同时让成千上万的订阅者收到消息。
如果你想让一个数据的变化立刻通知到多个其他服务,Pub/Sub是典型用法。 在电商系统中,当有新品上架时,发布者发布一条“new_product”消息,订阅了这个消息的多个服务(比如推荐系统、库存系统、营销系统)会立刻收到通知,然后各自去做相应的处理。
第二部分:键空间通知(Keyspace Notification)—— 门铃通知系统
你问的“键的订阅”更准确的叫法是“键空间通知”,它和Pub/Sub很像,但触发方式完全不同,它不是你自己去“发布”消息,而是由Redis内核在某个键被操作时自动帮你发布消息。
把它想象成你家的门铃和监控摄像头:

-
键(Key):就是你家的门。
-
对键的操作(如 set, del, expire):就是有人敲门、用钥匙开门、门自动锁上等事件。
-
键空间通知:就是安装在你门上的门铃和传感器,当发生特定事件时(有人按门铃),它自动发出信号(铃响)。
-
怎么用?(引用来源:Redis配置和命令) 这个方法比Pub/Sub多一个步骤,因为默认情况下这个“门铃系统”是关着的。
-
开启通知功能(安装门铃电源):需要修改Redis的配置文件
redis.conf,找到notify-keyspace-events这个配置项,给它设置一个值。
KEA表示启用所有类型的键空间和键事件通知(最全面)。Kg$l表示只监听列表(list)键的过期(expire)事件(更精细的控制)。- 修改配置后需要重启Redis服务生效,或者在不重启的情况下,用
CONFIG SET notify-keyspace-events KEA命令临时开启(重启后失效)。
-
订阅通知(坐在屋里等门铃响):通知是通过Pub/Sub机制发出的,所以你还是需要用一个客户端去订阅一个特殊的频道,这个频道的名字有固定格式:
- 格式1:
__keyspace@0__:键名:这个频道只告诉你发生了什么事,比如你对键mydoor执行了DEL命令,那么订阅频道__keyspace@0__:mydoor的客户端会收到一条消息,内容就是del。 - 格式2:
__keyevent@0__:事件类型:这个频道告诉你哪个键发生了这个事,比如你订阅了__keyevent@0__:del频道,那么当任何键被删除时,你都会收到消息,内容是被删除的键的名字,mydoor。 (注:@0中的0是数据库编号,默认是0。)
- 格式1:
-
-
举个例子:
- 先用命令
CONFIG SET notify-keyspace-events KEA开启所有通知。 - 打开客户端A,订阅特定键的事件:
PSUBSCRIBE __keyspace@0__:mykey(PSUBSCRIBE支持模糊匹配,这里用精确的键名)。 - 打开客户端B,执行
SET mykey hello。 - 立刻,在客户端A中,你就会收到一条消息,表明
mykey这个键发生了set操作。
- 先用命令
第三部分:总结与对比
现在可以清楚地回答你的问题了:
-
怎么让数据变化立刻被发现?
- 方法一(主动广播):使用发布/订阅(Pub/Sub),让你的程序在数据改变后,主动执行
PUBLISH命令,像喇叭一样广播出去,谁感兴趣谁就听着。 - 方法二(自动监控):使用键空间通知,先开启Redis的监控功能,然后订阅那些由Redis自动发出的、关于键操作的通知,你不需要主动广播,Redis会像监控探头一样,帮你盯着一批键(甚至所有键),一旦有变动就自动告警。
- 方法一(主动广播):使用发布/订阅(Pub/Sub),让你的程序在数据改变后,主动执行
-
键的订阅到底咋用? “键的订阅”指的就是键空间通知的用法,关键三步:
- 开总闸:用
CONFIG SET命令设置notify-keyspace-events,告诉Redis你想监听哪些事件(比如键的新增、修改、删除、过期)。 - 接线路:用一个客户端(比如你的应用程序)使用
PSUBSCRIBE命令订阅那些特殊格式的频道(如__keyspace@0__:*来监听所有键的所有事件)。 - 等通知:之后,只要有其他客户端对Redis的键进行了你监听的操作,你的应用程序就会立刻收到详细的通知消息。
- 开总闸:用
最后一点重要的提醒:无论是Pub/Sub还是键空间通知,它们都是“即发即弃”的,如果订阅方当时不在线(网络断开或服务重启),就会永久丢失这条消息,所以它适合用于对可靠性要求不是极高、但要求速度极快的场景(如实时更新在线用户列表),如果消息绝对不能丢,你需要考虑更复杂的消息队列(如Redis自家的Streams数据结构)。
本文由盈壮于2026-01-09发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://www.haoid.cn/wenda/77598.html
