gpt4 book ai didi

api - 用 C 模块覆盖内置的 Redis 命令

转载 作者:IT王子 更新时间:2023-10-29 06:09:31 26 4
gpt4 key购买 nike

我尝试通过使用 Redis API 实现一个模块来覆盖 set Redis 内置命令。我想在特定 channel 上发布设定值。 notify-keyspace-events KEAg 如果值是在 channel 上发送的,那将是一个很好的解决方案,但事实并非如此。

我还尝试直接使用 API 覆盖 set 命令,但是 RedisModule_CreateCommand 似乎只适用于新命令,不适用于内置命令。

我还尝试创建一个命令,如 setpub 并使用 rename-command SET SETPUBSETPUB 似乎无法识别,即使我们使用rename-commandafterloadmodule setpub.so`。

有没有办法覆盖内置命令?

最佳答案

不,没有。可能很快就会有一种方法可以用钩子(Hook)包装 native 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);

关于api - 用 C 模块覆盖内置的 Redis 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49729332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com