Redis模块:在模块中调用dump命令什么都不返回

时间:2018-01-06 15:02:32

标签: c redis

我开发了一个调用本机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命令什么都不返回。

1 个答案:

答案 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;
}