Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Redis模块:在模块中调用dump命令不返回任何内容_C_Redis - Fatal编程技术网

C Redis模块:在模块中调用dump命令不返回任何内容

C 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

我开发了一个redis模块,它调用本机redis
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;
}