c - redisAsyncCommand 中 privdata 参数的用途是什么?

标签 c redis hiredis

源代码中为 redisAsyncCommand( ) 提供的函数定义是:

static int __redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *cmd, size_t len) { ... }

void *privdata 参数的目的是什么?在什么情况下会有用?

最佳答案

我通过阅读 gihub 上的代码了解到,privdata 的目的是向您的回调发送一些预定义的数据(可以是任何东西;这就是使用 void* 的原因)。在您的回调中(fn 指向 redisCallbackFn 的指针)您将收到该 privdata 作为参数(例如查看 cb->fn(ac,reply,cb->privdata); 在 func __redisRunCallback 文件 async.c)

例如(类似的简化伪代码)如下。在此示例中,有 3 次连续调用 __redisAsyncCommandSimplified 并且只有一个处理程序(回调)。在回调中,我使用 privdata 来确定行为 打回来。您的回调还可以将该 privdata 数据用于其他用途(例如另一个函数调用的参数、日志记录、结构创建/填充等)...

#include <stdio.h>
#include <string.h>

typedef void (*Callback)(int, void*);

int __redisAsyncCommandSimplified(Callback call, void* privdata) {
    call(1, privdata);
    return 1;
}

void myHandler(int status, void* privdata) {
    char* str = (char*)privdata;
    printf("%s = ", str);
    if (strcmp (str, "john") == 0) {
        printf("lennon");
    }
    else if (strcmp(str, "ringo") == 0) {
        printf("star");
    }
    else if (strcmp(str, "ringo") == 0) {
        printf("star");
    }
    else if (strcmp(str, "paul") == 0) { 
        printf("mccartney");
    }
    else if (strcmp(str, "george")) { 
        printf("harrison");
    }    
    else {
        printf("who?!?");
    }
    printf("\n");
}


int main()
{
  char c[20];
  strcpy(c, "john");
  __redisAsyncCommandSimplified(myHandler, c);
  strcpy(c, "paul");
  __redisAsyncCommandSimplified(myHandler, c);
  strcpy(c, "someone else");
  __redisAsyncCommandSimplified(myHandler, c);
  return 0;
}

关于c - redisAsyncCommand 中 privdata 参数的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30800594/

相关文章:

c++ - 如何消除写入位置的访问冲突

JavacompareAndSet 以原子方式更新 BST 中的引用

c - 在 stdin 上使用 strtok 时遇到问题

Redis 帮助 - 将具有特定 ID 的现有键替换为新值

c - 使用 valgrind 的 hiredis 中的内存泄漏

python - 在 C 中使用 hiredis 访问 redis 哈希

c - UDP -- 套接字 - 绑定(bind)错误 - 地址已被使用?

node.js - Redis后台发生了什么?

redis 显示 lrange 列表的空集

c++ - 为用户定义对象的指针的内存管理编写一个安全的包装类