Redis值notify.c阅读

本文深入解析Redis中键空间事件通知的实现细节,包括如何将字符串参数转换为flags值,以及如何根据flags值还原设置所需的字符串。同时,介绍了如何使用notifyKeyspaceEvent函数发布键事件通知。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

keyspaceEventsStringToFlags:对传入的字符串参数进行分析, 给出相应的 flags 值

int keyspaceEventsStringToFlags(char *classes) {
    char *p = classes;
    int c, flags = 0;

    while((c = *p++) != '\0') {
        switch(c) {
        case 'A': flags |= REDIS_NOTIFY_ALL; break;
        case 'g': flags |= REDIS_NOTIFY_GENERIC; break;
        case '$': flags |= REDIS_NOTIFY_STRING; break;
        case 'l': flags |= REDIS_NOTIFY_LIST; break;
        case 's': flags |= REDIS_NOTIFY_SET; break;
        case 'h': flags |= REDIS_NOTIFY_HASH; break;
        case 'z': flags |= REDIS_NOTIFY_ZSET; break;
        case 'x': flags |= REDIS_NOTIFY_EXPIRED; break;
        case 'e': flags |= REDIS_NOTIFY_EVICTED; break;
        case 'K': flags |= REDIS_NOTIFY_KEYSPACE; break;
        case 'E': flags |= REDIS_NOTIFY_KEYEVENT; break;
        // 不能识别
        default: return -1;
        }
    }

    return flags;
}

keyspaceEventsFlagsToString:根据 flags 值还原设置这个 flags 所需的字符串

sds keyspaceEventsFlagsToString(int flags) {
    sds res;

    res = sdsempty();
    if ((flags & REDIS_NOTIFY_ALL) == REDIS_NOTIFY_ALL) {
        res = sdscatlen(res,"A",1);
    } else {
        if (flags & REDIS_NOTIFY_GENERIC) res = sdscatlen(res,"g",1);
        if (flags & REDIS_NOTIFY_STRING) res = sdscatlen(res,"$",1);
        if (flags & REDIS_NOTIFY_LIST) res = sdscatlen(res,"l",1);
        if (flags & REDIS_NOTIFY_SET) res = sdscatlen(res,"s",1);
        if (flags & REDIS_NOTIFY_HASH) res = sdscatlen(res,"h",1);
        if (flags & REDIS_NOTIFY_ZSET) res = sdscatlen(res,"z",1);
        if (flags & REDIS_NOTIFY_EXPIRED) res = sdscatlen(res,"x",1);
        if (flags & REDIS_NOTIFY_EVICTED) res = sdscatlen(res,"e",1);
    }
    if (flags & REDIS_NOTIFY_KEYSPACE) res = sdscatlen(res,"K",1);
    if (flags & REDIS_NOTIFY_KEYEVENT) res = sdscatlen(res,"E",1);

    return res;
}

notifyKeyspaceEvent:发布键事件通知

void notifyKeyspaceEvent(int type, char *event, robj *key, int dbid) {
    sds chan;
    robj *chanobj, *eventobj;
    int len = -1;
    char buf[24];

    /* If notifications for this class of events are off, return ASAP. */
    // 如果服务器配置为不发送 type 类型的通知,那么直接返回
    if (!(server.notify_keyspace_events & type)) return;

    // 事件的名字
    eventobj = createStringObject(event,strlen(event));

    /* __keyspace@<db>__:<key> <event> notifications. */
    // 发送键空间通知
    if (server.notify_keyspace_events & REDIS_NOTIFY_KEYSPACE) {

        // 构建频道对象
        chan = sdsnewlen("__keyspace@",11);
        len = ll2string(buf,sizeof(buf),dbid);
        chan = sdscatlen(chan, buf, len);
        chan = sdscatlen(chan, "__:", 3);
        chan = sdscatsds(chan, key->ptr);

        chanobj = createObject(REDIS_STRING, chan);

        // 通过 publish 命令发送通知
        pubsubPublishMessage(chanobj, eventobj);

        // 释放频道对象
        decrRefCount(chanobj);
    }

    /* __keyevente@<db>__:<event> <key> notifications. */
    // 发送键事件通知
    if (server.notify_keyspace_events & REDIS_NOTIFY_KEYEVENT) {

        // 构建频道对象
        chan = sdsnewlen("__keyevent@",11);
        // 如果在前面发送键空间通知的时候计算了 len ,那么它就不会是 -1
        // 这可以避免计算两次 buf 的长度
        if (len == -1) len = ll2string(buf,sizeof(buf),dbid);
        chan = sdscatlen(chan, buf, len);
        chan = sdscatlen(chan, "__:", 3);
        chan = sdscatsds(chan, eventobj->ptr);

        chanobj = createObject(REDIS_STRING, chan);

        // 通过 publish 命令发送通知
        pubsubPublishMessage(chanobj, key);

        // 释放频道对象
        decrRefCount(chanobj);
    }

    // 释放事件对象
    decrRefCount(eventobj);
}
### 使用 Homebrew 在 Mac 上安装和配置 Redis #### 安装 Homebrew 为了在 macOS 上利用 Homebrew 来安装 Redis,需先确认已成功部署 Homebrew。通常情况下,在终端执行 `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"` 即可完成 Homebrew 的安装[^1]。 #### 验证 Homebrew 安装 通过 `brew doctor` 命令来验证 Homebrew 是否正确安装以及环境是否健康。这一步骤有助于解决潜在的问题,确保后续操作顺利进行[^2]。 #### 安装 Redis 一旦 Homebrew 准备就绪,可以通过简单的命令行指令安装 Redis: ```bash brew install redis ``` 此命令会自动下载并编译最新版本的 Redis 到系统的指定位置,默认位于 `/usr/local/Cellar/redis/<version>` 下[^3]。 #### 启动与停止 Redis 服务 安装完成后,可以使用以下命令启动 Redis 服务器: ```bash brew services start redis ``` 同样地,如果想要关闭正在运行的服务,则应输入: ```bash brew services stop redis ``` #### 查找 Redis 配置文件 Redis 的主要配置文件名为 `redis.conf`,一般放置于 `/usr/local/etc/` 文件夹内。对于希望调整某些参数(比如端口号、绑定地址等),可以直接编辑该文件实现自定义设置。 #### 修改 Redis 运行模式 为了让 Redis 支持远程连接或是更改其他行为特性,可能需要对上述提到的配置文件做出相应改动。例如允许来自不同 IP 地址的数据请求,就需要放开 bind 参数限制;而要启用 key 过期通知功能,则应在配置中加入 notify-keyspace-events Ex。 #### 备份数据存储路径 默认情况下,Redis 数据库保存的位置是在 `/usr/local/var/db/redis/` 中。如果有特殊需求改变这个目录,可通过修改配置文件中的 dir 字段指向新的目标位置,也可以直接查询当前使用的数据库路径: ```bash redis-cli CONFIG GET dir ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值