我尝试使用Redis API实现模块来覆盖set
Redis内置命令。我想在特定频道上发布设定值。如果价值是在渠道上发送的,那么notify-keyspace-events KEAg
将是一个很好的解决方案,但事实并非如此。
我还尝试直接使用API覆盖set
命令,但RedisModule_CreateCommand
似乎只适用于新命令,而不适用于内置命令。
我还尝试创建像setpub
这样的命令并使用rename-command SET SETPUB
但是SETPUB doesn't seem to be recognize, even if we use
rename-command after
loadmodule setpub.so`。
有没有办法覆盖内置命令?
答案 0 :(得分:2)
不,没有。可能很快就会有一种方法用钩子包装本机redis命令,但这仍然不可用。
但您可以在4.0.9中使用新的模块通知API,并在模块中注册通知处理程序,并在其中提取正在设置的键的值 - 然后发布它。
通知处理程序应该看起来像这样(不测试有效性):
int NotifyCallback(RedisModuleCtx *ctx, int type, const char *event,
RedisModuleString *key) {
// We only care about SET events, right?
if (!strcasecmp(event, "SET")) {
// Open the key to get the string in it. We could have used RedisModule_Call but this is faster:
RedisModuleKey *k = RedisModule_OpenKey(ctx, key, REDISMODULE_READ);
// Just to be safe...
if (k && RedisModule_KeyType(k) == REDISMODULE_KEYTYPE_STRING) {
// Get direct access to the string. Careful now!
size_t len;
char *str = RedisModule_StringDMA(ctx, k, &len, REDISMODULE_READ);
// Sadly PUBLISH is only supported with RM_Call at the moment...
// Do change what you're publishing here of course
RedisModule_Call(ctx, "PUBLISH", "cb", MY_PUBSUB_CHANNEL, str, len);
// Cleanup
RedisModule_CloseKey(k);
}
}
return REDISMODULE_OK;
}
您可以在模块初始化调用中注册处理程序:
RedisModule_SubscribeToKeyspaceEvents(ctx, REDISMODULE_NOTIFY_STRING, NotifyCallback);