在redisAsyncCommand中使用privdata参数有什么用?

时间:2015-06-12 10:16:18

标签: c redis hiredis

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

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

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

1 个答案:

答案 0 :(得分:3)

正如我通过阅读gihub上的代码所理解的那样,privdata的目的是向你的回调发送一些预定义的数据(可以是任何东西;这就是使用void *的原因)。在你的回调(fn指向redisCallbackFn的指针)中,你会收到privdata作为参数(例如在func cb->fn(ac,reply,cb->privdata);文件__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;
}