gpt4 book ai didi

c - Redis 模块 RESTORE 命令调用

转载 作者:可可西里 更新时间:2023-11-01 11:15:19 25 4
gpt4 key购买 nike

我想将文件中的序列化 key 恢复到模块中的 redis 内存中。

代码如下:

int Unarchive_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {

if (argc != 2) {
RedisModule_WrongArity(ctx);
} else {

RedisModuleString *keyName = argv[1];
long long unarchiedKeys = 0;
const char *filename = RedisModule_StringPtrLen(keyName, NULL);
FILE *f = fopen(filename, "r");

if (f != NULL && access(filename, F_OK) != -1) {

struct stat info;

if (stat(filename, &info) != 0) {

RedisModule_ReplyWithError(ctx, "Error during file read");
}

size_t valueSize = info.st_size * sizeof(char);
char *keyValue = RedisModule_Alloc(valueSize);
fread(&keyValue, (size_t) info.st_size, 1, f);
fclose(f);
RedisModule_ReplyWithCallReply(ctx, RedisModule_Call(ctx, "RESTORE", "slbc", keyName, 0, keyValue, "REPLACE"));

remove(filename);
unarchiedKeys++;
}

RedisModule_ReplyWithLongLong(ctx, unarchiedKeys);
}
return REDISMODULE_OK;
}

当我运行此命令时,我在执行行 RedisModule_ReplyWithCallReply(ctx, RedisModule_Call(ctx, "RESTORE", "slcc", keyName, 0, keyValue , "替换"));

谁能帮我解决这个问题?

提前致谢。

最佳答案

Segfaults 通常是由取消引用空指针引起的,空指针通常指向不属于进程地址空间的地址。可以肯定的是,这类问题是您的问题。一般来说,您在使用变量之前似乎已经很好地验证了变量,但有一些值得注意的异常(exception):

  • 第一次使用ctx(除非argc计数错误,或者stat!= 0) 在对 RedisModule_ReplyWithCallReply 的调用中。它应该使用前检查它是否不为空。
  • RedisModule_Call 返回值时无法检查作为另一个函数的参数调用。根据这个 API documentation ,此函数为错误的回复类型返回 NULL。

建议删除对 RedisModule_Call 的嵌入式调用,这样您就可以在将其作为参数传递给 RedisModule_ReplyWithCallReply() 之前测试它的返回值。

RedisModuleCallReply *reply = RedisModule_Call(ctx, "RESTORE", "slbc", keyName, 0, keyValue, valueSize, "REPLACE");
if(!reply)
{
// handle error;
}
else
{
RedisModule_ReplyWithCallReply(ctx, reply);
}

编辑:
另一个想法,行:

    fread(&keyValue, (size_t) info.st_size, 1, f);
^//not needed

应该是:

    fread(keyValue, (size_t) info.st_size, 1, f);

关于c - Redis 模块 RESTORE 命令调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50528866/

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