C Redis模块:在模块中调用dump命令不返回任何内容
我开发了一个redis模块,它调用本机redisC Redis模块:在模块中调用dump命令不返回任何内容,c,redis,C,Redis,我开发了一个redis模块,它调用本机redisDUMP命令。 但是当我在现有键上调用dump命令时,不会返回任何内容,但是如果我用GET替换dump命令,则返回值 代码如下: #include "redismodule.h" #include <stdio.h> #include <stdlib.h> int mydump_command(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { RED
DUMP
命令。
但是当我在现有键上调用dump命令时,不会返回任何内容,但是如果我用GET
替换dump
命令,则返回值
代码如下:
#include "redismodule.h"
#include <stdio.h>
#include <stdlib.h>
int mydump_command(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
REDISMODULE_NOT_USED(argc);
RedisModule_AutoMemory(ctx);
RedisModuleCallReply *rep = RedisModule_Call(ctx, "DUMP", "s", argv[1]);
const char *value = RedisModule_CallReplyStringPtr(rep, NULL);
RedisModule_Log(ctx, "warning", value);
RedisModule_ReplyWithSimpleString(ctx, value);
return REDISMODULE_OK;
}
int myget_command(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
REDISMODULE_NOT_USED(argc);
RedisModule_AutoMemory(ctx);
RedisModuleCallReply *rep = RedisModule_Call(ctx, "GET", "s", argv[1]);
const char *value = RedisModule_CallReplyStringPtr(rep, NULL);
RedisModule_Log(ctx, "warning", value);
RedisModule_ReplyWithSimpleString(ctx, value);
return REDISMODULE_OK;
}
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
if (RedisModule_Init(ctx, "module_test", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) {
return REDISMODULE_ERR;
}
if (RedisModule_CreateCommand(ctx, "mydump", mydump_command, "write deny-oom", 1, 1, 1) == REDISMODULE_ERR) {
return REDISMODULE_ERR;
}
if (RedisModule_CreateCommand(ctx, "myget", myget_command, "write deny-oom", 1, 1, 1) == REDISMODULE_ERR) {
return REDISMODULE_ERR;
}
return REDISMODULE_OK;
}
请注意,使用我的自定义命令,redis cli不会显示双引号
有人能帮我知道为什么调用
DUMP
命令什么也不返回。代码中的问题是,您将应答视为一个简单的字符串,而Redis'可能是二进制的。当GET
返回一个简单的字符串值时(当您SET foo bar
时),DUMP
s编码是二进制的。以下工作:
int mydump_command(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
REDISMODULE_NOT_USED(argc);
RedisModule_AutoMemory(ctx);
RedisModuleCallReply *rep = RedisModule_Call(ctx, "DUMP", "s", argv[1]);
size_t vlen;
const char *value = RedisModule_CallReplyStringPtr(rep, &vlen);
RedisModule_ReplyWithStringBuffer(ctx, value, vlen);
return REDISMODULE_OK;
}
你不能提供一些我们可以在系统上测试的吗?请编辑您的问题以改进它,因此请给我们您的
main
函数…当然。但是我只能提供模块代码。然后显示加载该模块的命令,可能还有一个最受欢迎的REDIS dataYou:)注意,您现有的myget
将以同样的方式对二进制字符串(即非“bar”)失败
int mydump_command(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
REDISMODULE_NOT_USED(argc);
RedisModule_AutoMemory(ctx);
RedisModuleCallReply *rep = RedisModule_Call(ctx, "DUMP", "s", argv[1]);
size_t vlen;
const char *value = RedisModule_CallReplyStringPtr(rep, &vlen);
RedisModule_ReplyWithStringBuffer(ctx, value, vlen);
return REDISMODULE_OK;
}