我开发了一个调用本机redis DUMP
命令的redis模块。
但是当我在现有密钥上调用dump命令时,没有任何东西返回,但如果我用DUMP
替换GET
命令,则返回值
以下是代码:
#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中,我得到以下结果:
127.0.0.1:6379> SET foo bar
OK
127.0.0.1:6379> GET foo
"bar"
127.0.0.1:6379> DUMP foo
"\x00\x03bar\b\x00_\x93\xa5\xdfG\x7fw/"
127.0.0.1:6379> mydump foo
127.0.0.1:6379> myget foo
bar
127.0.0.1:6379>
请注意,使用我的自定义命令,redis-cli不会显示双引号。
有人可以帮助我知道为什么调用DUMP
命令什么都不返回。
答案 0 :(得分:1)
您的代码中的问题是您将回复视为一个简单的字符串,而Redis&#39;可能是二进制的。虽然GET
返回一个简单的字符串值(与SET foo bar
一样),但DUMP
的编码是二进制的。以下作品:
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;
}