当前位置:首页 > 问答 > 正文

Redis订阅怎么让数据变化立刻被发现,键的订阅到底咋用

关于Redis订阅如何让数据变化立刻被发现,以及键的订阅到底怎么用,我们可以把它想象成一个“小区广播系统”和“门铃通知系统”的区别,理解了这两个比喻,你就明白核心了。

第一部分:Redis的发布/订阅(Pub/Sub)—— 小区广播系统

这个功能的目的就是为了实现你所说的“数据变化立刻被发现”,它的工作模式非常简单直接,就像电台广播。

  • 角色有三个:

    1. 发布者(Publisher):负责发布消息的人,它不关心谁在听,只负责对着某个“频道”喊话。
    2. 频道(Channel):就是广播的频率或频道名称,新闻频道”、“体育频道”。
    3. 订阅者(Subscriber):想要接收消息的人,它需要先“调频”到感兴趣的频道,然后就能听到这个频道所有发布者说的话。
  • 怎么用?(引用来源:Redis命令)

    • 让一个客户端成为订阅者:使用 SUBSCRIBE 命令,打开一个Redis命令行,输入 SUBSCRIBE news,这个客户端就开始监听 news 这个频道了,它会进入一个等待状态,专门接收消息。
    • 让另一个客户端发布消息:再打开一个Redis命令行,使用 PUBLISH 命令,比如输入 PUBLISH news "今天天气晴"
    • 立刻发生的事:在第一个订阅了 news 频道的客户端里,你会立刻看到一条消息显示出来,内容就是“今天天气晴”,这个过程几乎是瞬间完成的。
  • 核心特点(为什么能“立刻被发现”):

    • 实时性:一旦消息被发布,所有订阅了该频道的客户端会同时收到,Redis服务器会主动把消息“推”给订阅者,而不是让订阅者不停地去“问”(轮询)。
    • 无存储:发布的消息不会被Redis保存,如果某个订阅者中途才加入,它收不到它加入之前发布的消息,就像你打开收音机,只能听到现在正在播的,听不到一小时前的节目。
    • 一对多:一个发布者可以同时让成千上万的订阅者收到消息。

如果你想让一个数据的变化立刻通知到多个其他服务,Pub/Sub是典型用法。 在电商系统中,当有新品上架时,发布者发布一条“new_product”消息,订阅了这个消息的多个服务(比如推荐系统、库存系统、营销系统)会立刻收到通知,然后各自去做相应的处理。

第二部分:键空间通知(Keyspace Notification)—— 门铃通知系统

你问的“键的订阅”更准确的叫法是“键空间通知”,它和Pub/Sub很像,但触发方式完全不同,它不是你自己去“发布”消息,而是由Redis内核在某个键被操作时自动帮你发布消息。

把它想象成你家的门铃和监控摄像头:

Redis订阅怎么让数据变化立刻被发现,键的订阅到底咋用

  • 键(Key):就是你家的门。

  • 对键的操作(如 set, del, expire):就是有人敲门、用钥匙开门、门自动锁上等事件。

  • 键空间通知:就是安装在你门上的门铃和传感器,当发生特定事件时(有人按门铃),它自动发出信号(铃响)。

  • 怎么用?(引用来源:Redis配置和命令) 这个方法比Pub/Sub多一个步骤,因为默认情况下这个“门铃系统”是关着的。

    1. 开启通知功能(安装门铃电源):需要修改Redis的配置文件 redis.conf,找到 notify-keyspace-events 这个配置项,给它设置一个值。

      Redis订阅怎么让数据变化立刻被发现,键的订阅到底咋用

      • KEA 表示启用所有类型的键空间和键事件通知(最全面)。
      • Kg$l 表示只监听列表(list)键的过期(expire)事件(更精细的控制)。
      • 修改配置后需要重启Redis服务生效,或者在不重启的情况下,用 CONFIG SET notify-keyspace-events KEA 命令临时开启(重启后失效)。
    2. 订阅通知(坐在屋里等门铃响):通知是通过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 开启所有通知。
    2. 打开客户端A,订阅特定键的事件:PSUBSCRIBE __keyspace@0__:mykey (PSUBSCRIBE支持模糊匹配,这里用精确的键名)。
    3. 打开客户端B,执行 SET mykey hello
    4. 立刻,在客户端A中,你就会收到一条消息,表明 mykey 这个键发生了 set 操作。

第三部分:总结与对比

现在可以清楚地回答你的问题了:

  • 怎么让数据变化立刻被发现?

    • 方法一(主动广播):使用发布/订阅(Pub/Sub),让你的程序在数据改变后,主动执行 PUBLISH 命令,像喇叭一样广播出去,谁感兴趣谁就听着。
    • 方法二(自动监控):使用键空间通知,先开启Redis的监控功能,然后订阅那些由Redis自动发出的、关于键操作的通知,你不需要主动广播,Redis会像监控探头一样,帮你盯着一批键(甚至所有键),一旦有变动就自动告警。
  • 键的订阅到底咋用? “键的订阅”指的就是键空间通知的用法,关键三步:

    1. 开总闸:用 CONFIG SET 命令设置 notify-keyspace-events,告诉Redis你想监听哪些事件(比如键的新增、修改、删除、过期)。
    2. 接线路:用一个客户端(比如你的应用程序)使用 PSUBSCRIBE 命令订阅那些特殊格式的频道(如 __keyspace@0__:* 来监听所有键的所有事件)。
    3. 等通知:之后,只要有其他客户端对Redis的键进行了你监听的操作,你的应用程序就会立刻收到详细的通知消息。

最后一点重要的提醒:无论是Pub/Sub还是键空间通知,它们都是“即发即弃”的,如果订阅方当时不在线(网络断开或服务重启),就会永久丢失这条消息,所以它适合用于对可靠性要求不是极高、但要求速度极快的场景(如实时更新在线用户列表),如果消息绝对不能丢,你需要考虑更复杂的消息队列(如Redis自家的Streams数据结构)。