You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redis的notifyKeyspaceEvent与pub/sub的关联及函数原理问询

关于Redis notifyKeyspaceEvent函数的工作机制与Pub/Sub关联解析

先看你给出的这段代码:它来自Redis的t_set.c文件中sremCommand函数,当srem命令成功从集合中删除成员时,就会调用notifyKeyspaceEvent发布对应的操作事件。下面直接拆解你的问题:

一、notifyKeyspaceEvent函数的工作机制

这个函数是Redis内部负责键操作事件广播的核心工具,直白说就是把Redis里发生的键操作,转化为可订阅的消息发出去,具体流程是:

  1. 权限校验:先检查Redis配置的notify-keyspace-events参数,判断当前要发布的事件类型是否在允许的范围内,如果不在就直接跳过,不发布任何消息;
  2. 构造频道:自动生成两个特殊的Pub/Sub频道:
    • 键空间频道:格式是__keyspace@<数据库ID>__:<目标键>,比如__keyspace@0__:mySet;
    • 键事件频道:格式是__keyevent@<数据库ID>__:<操作事件>,比如__keyevent@0__:srem;
  3. 分发消息:通过Redis的Pub/Sub系统,给这两个频道发送消息——键空间频道的消息内容是具体操作(比如srem),键事件频道的消息内容是触发事件的键名;
  4. 模块回调:如果有第三方Redis模块注册了事件监听,函数也会触发对应的模块回调逻辑。

它的几个参数作用:

  • type:指定事件所属类别(比如NOTIFY_SET对应集合操作,NOTIFY_GENERIC对应通用操作),用来匹配配置中的允许类型;
  • event:具体的操作名称(比如srem、del);
  • key:触发事件的目标键;
  • dbid:键所在的数据库编号。

二、和Redis Pub/Sub的关联

notifyKeyspaceEvent完全基于Redis的Pub/Sub系统实现,是Pub/Sub的专属内部应用场景——Redis把自身的键操作事件,包装成Pub/Sub消息对外分发,让外部客户端可以通过订阅这些特殊频道,实时监控Redis内部的键变化。

三、在Pub/Sub中的具体用法

1. 先开启事件通知

首先要通过配置或动态命令开启对应的事件类型,比如用CONFIG SET临时设置:

CONFIG SET notify-keyspace-events "Ks"

参数说明:

  • K:开启键空间频道的通知;
  • s:开启集合类操作的事件(对应srem这类命令);
    如果还要监听del这类通用操作,就把参数改成Ksg(g对应通用操作)。

2. 客户端订阅事件频道

用普通的Pub/Sub订阅命令即可:

  • 要监控某个特定键的所有操作:
SUBSCRIBE __keyspace@0__:mySet

当mySet这个键上执行srem时,客户端会收到消息内容srem;

  • 要监控所有键的srem操作:
SUBSCRIBE __keyevent@0__:srem

不管哪个键执行srem,客户端都会收到该键的名称。

3. 代码中的触发逻辑

就像你给出的sremCommand代码:
当srem成功删除成员(deleted不为0)时,调用notifyKeyspaceEvent(NOTIFY_SET,"srem",c->argv[1],c->db->id),这就会自动向对应的两个频道发送消息;如果键被完全删除(keyremoved为真),还会触发del事件的通知,也就是调用notifyKeyspaceEvent(NOTIFY_GENERIC,"del",c->argv[1],c->db->id)。

内容的提问来源于stack exchange,提问作者Kevin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:50:02