/* The API provided to the rest of the Redis core is a simple function: * * notifyKeyspaceEvent(char *event, robj *key, int dbid); * * 'event' is a C string representing the event name. * * event 参数是一个字符串表示的事件名 * * 'key' is a Redis object representing the key name. * * key 参数是一个 Redis 对象表示的键名 * * 'dbid' is the database ID where the key lives. * * dbid 参数为键所在的数据库 */ 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); }
void publishCommand(client *c) { int receivers = pubsubPublishMessage(c->argv[1],c->argv[2]); if (server.cluster_enabled) clusterPropagatePublish(c->argv[1],c->argv[2]); else forceCommandPropagation(c,PROPAGATE_REPL); addReplyLongLong(c,receivers); }
/* The API provided to the rest of the Redis core is a simple function: * * notifyKeyspaceEvent(char *event, robj *key, int dbid); * * 'event' is a C string representing the event name. * 'key' is a Redis object representing the key name. * 'dbid' is the database ID where the key lives. */ void notifyKeyspaceEvent(int type, char *event, robj *key, int dbid) { sds chan; robj *chanobj, *eventobj; int len = -1; char buf[24]; /* If any modules are interested in events, notify the module system now. * This bypasses the notifications configuration, but the module engine * will only call event subscribers if the event type matches the types * they are interested in. */ moduleNotifyKeyspaceEvent(type, event, key, dbid); /* If notifications for this class of events are off, return ASAP. */ if (!(server.notify_keyspace_events & type)) return; eventobj = createStringObject(event,strlen(event)); /* __keyspace@<db>__:<key> <event> notifications. */ if (server.notify_keyspace_events & 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(OBJ_STRING, chan); pubsubPublishMessage(chanobj, eventobj); decrRefCount(chanobj); } /* __keyevent@<db>__:<event> <key> notifications. */ if (server.notify_keyspace_events & NOTIFY_KEYEVENT) { chan = sdsnewlen("__keyevent@",11); 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(OBJ_STRING, chan); pubsubPublishMessage(chanobj, key); decrRefCount(chanobj); } decrRefCount(eventobj); }
void do_bridge_notify(void *pdb,void *pkeyobj) { redisDb *db=(redisDb *)pdb; robj *keyobj=(robj *)pkeyobj; if(server.bridge_db.bridge_event[db->id]==BRIDGE_KEY_NOTIFY) //do notify event { sds key = sdsnew(BRIDGE_SYSTEM_CHANNEL); robj *bridge_channel = createStringObject(key,sdslen(key)); int receivers = pubsubPublishMessage(bridge_channel,keyobj); if (server.cluster_enabled) clusterPropagatePublish(bridge_channel,keyobj); redisLog(REDIS_NOTICE,"%d clients receive the expire event",receivers); decrRefCount(bridge_channel); } }
//通知键空间事件 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. */ 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); pubsubPublishMessage(chanobj, eventobj); decrRefCount(chanobj); } /* __keyevente@<db>__:<event> <key> notifications. */ if (server.notify_keyspace_events & REDIS_NOTIFY_KEYEVENT) { chan = sdsnewlen("__keyevent@",11); 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); pubsubPublishMessage(chanobj, key); decrRefCount(chanobj); } decrRefCount(eventobj); }
int ugPublish(lua_State* L) { int top = lua_gettop(L); int recvs; robj* channel, *message; const char* p1, *p2; if (top != 2) { lua_pushnil(L); lua_pushstring(L, "wrong number of arguments for publish."); return 2; } p1 = luaL_checkstring(L, 1); p2 = luaL_checkstring(L, 2); channel = createStringObject((char*) p1, strlen(p1)); message = createStringObject((char*) p2, strlen(p2)); recvs = pubsubPublishMessage(channel, message); decrRefCount(channel); decrRefCount(message); lua_pushinteger(L, recvs); return 1; }
void publishCommand(redisClient *c) { int receivers = pubsubPublishMessage(c->argv[1],c->argv[2]); addReplyLongLong(c,receivers); }
void publishCommand(redisClient *c) { int receivers = pubsubPublishMessage(c->argv[1],c->argv[2]); if (server.cluster_enabled) clusterPropagatePublish(c->argv[1],c->argv[2]); addReplyLongLong(c,receivers); }
void publishCommand(redisClient *c) { int receivers = pubsubPublishMessage(c->argv[1],c->argv[2]); forceCommandPropagation(c,REDIS_PROPAGATE_REPL); addReplyLongLong(c,receivers); }