복붙노트

[REDIS] 우리는 hiredis에 의해 레디 스에서 키의 값으로 C의 int 배열을 설정할 수 있습니까?

REDIS

우리는 hiredis에 의해 레디 스에서 키의 값으로 C의 int 배열을 설정할 수 있습니까?

제공 : INT (X) [3] = {11,22,33}; 이진 데이터와 같은 키의 값으로 저장하고 그것을 얻을 수있는 방법

hiredis 바이너리 safestring을 설정하는 방법을 예제를 제공

   /* Set a key using binary safe API */
   reply = redisCommand(c,"SET %b %b", "bar", (size_t) 3, "hello", (size_t) 5);
   printf("SET (binary API): %s\n", reply->str);
   freeReplyObject(reply);

하지만 어떻게 다른 데이터와 방법에 대한을 얻으려면?

해결법

  1. ==============================

    1.어떤 종류의 마샬링없이 원격 저장소에 직접적 이진 데이터를 저장하는 것은 재앙이다. 나는 그것을 할 권하고 싶지 않다 : 당신이 플랫폼에서 이진 데이터 독립을하는 데 사용할 수있는 시리얼 프로토콜의 많음이있다.

    어떤 종류의 마샬링없이 원격 저장소에 직접적 이진 데이터를 저장하는 것은 재앙이다. 나는 그것을 할 권하고 싶지 않다 : 당신이 플랫폼에서 이진 데이터 독립을하는 데 사용할 수있는 시리얼 프로토콜의 많음이있다.

    그게 당신의 질문에 대답했다 :

    // This is the key
    int k[3] = {11,22,33};
    
    // This is the value
    int v[4] = {0,1,2,3};
    redisReply *reply = 0;
    
    // Store the key/value: note the usage of sizeof to get the size of the arrays (in bytes)
    reply = redisCommand(context, "SET %b %b", k, (size_t) sizeof(k), v, (size_t) sizeof(v) );
    if (!reply)
        return REDIS_ERR;
    freeReplyObject(reply);
    
    // Now, get the value back, corresponding to the same key
    reply = redisCommand(context, "GET %b", k, (size_t) sizeof(k) );
    if ( !reply )
        return REDIS_ERR;
    if ( reply->type != REDIS_REPLY_STRING ) {
        printf("ERROR: %s", reply->str);
    } else {
    
        // Here, it is safer to make a copy to be sure memory is properly aligned
        int *val = (int *) malloc( reply->len );
        memcpy( val, reply->str, reply->len);
        for (int i=0; i<reply->len/sizeof(int); ++i )
            printf("%d\n",val[i]);
        free( val );
    }
    freeReplyObject(reply);
    

    당신이 확실 모든 레디 스의 클라이언트가 동일한 엔디 언과 같은를 sizeof (int)를 가진 시스템에서 실행하는 것이 있다면 이런 종류의 코드에만 작동합니다.

  2. from https://stackoverflow.com/questions/26799074/can-we-set-c-int-array-as-a-keys-value-in-redis-by-hiredis by cc-by-sa and MIT license