Redis: Могу ли я сохранить структурный тип c / c ++, содержащий указатели на массив в Redis? - PullRequest
0 голосов
/ 02 марта 2020

У меня есть такая структура:

struct father {
    int child_n; //the number of children
    int *child_age; //childrens' age
}

Могу ли я сохранить структуру такого типа с массивом переменной длины в Redis

1 Ответ

0 голосов
/ 02 марта 2020

Я решил это с помощью вложенного * списка Redis , вот пример:

#include <iostream>
#include <string>
#include <cstring>
#include <hiredis/hiredis.h>

typedef struct stu {
    int stu_num;
    int* stu_age;
} stu;

using namespace std;


void put_stus(string key, stu students) {
    // connect to Redis server
    redisContext *connect = redisConnect("127.0.0.1",6379);
    if(!connect) {
        cout << "connect to redis fail" << endl;
        exit(-1);
    }

    // upload students' age
    redisReply *r;
    for(int i = 0;i < students.stu_num;i++) {
        r = (redisReply *)redisCommand(connect, "RPUSH %s:age %b",key,&students.stu_age[i],sizeof(students.stu_age[i]));
        if(r->type == REDIS_REPLY_ERROR) {
            cout << "put_stus error" << endl;
            exit(-1);
        }
        freeReplyObject(r);
    }
    // upload struct
    r = (redisReply *)redisCommand(connect, "SET %s %b",key,&students,sizeof(students));
    if(r->type == REDIS_REPLY_ERROR) {
        cout << "put_stus error" <<endl;
        exit(-1);
    }
    freeReplyObject(r);
    redisFree(connect);
}

void get_stus(string key, stu *r_students) {
    // connect to Redis Server
    redisContext *connect = redisConnect("127.0.0.1",6379);
    if(!connect) {
        cout << "connect to redis fail" << endl;
        exit(-1);
    }

    // Get sturct
    redisReply *r;
    r = (redisReply *)redisCommand(connect, "GET %s",key);
    if(r->type == REDIS_REPLY_ERROR) {
        cout << "get_stus error" <<endl;
        exit(-1);
    }
    memcpy(r_students,r->str,r->len);
    // Get students' age
    r_students->stu_age = (int *)malloc(r_students->stu_num * sizeof(int));
    if(!r_students->stu_age) {
        cout << "malloc error" << endl;
        exit(-1);
    }
    r = (redisReply *)redisCommand(connect, "LRANGE %s:age 0 -1",key);
    if(r->type == REDIS_REPLY_ERROR) {
        cout << "get_stus error" <<endl;
        exit(-1);
    }
    else if(r->type == REDIS_REPLY_ARRAY) {
        for(int i = 0;i < r_students->stu_num;i++) {
            memcpy(r_students->stu_age + i, r->element[i]->str, r->element[i]->len);
        }
    }
    freeReplyObject(r);
    redisFree(connect);
}

int main() {
    stu stu_a,stu_b;
    stu_a.stu_num = 3;
    int ages[3] = {1,2,3};
    stu_a.stu_age = ages;

    put_stus("test1",stu_a);
    get_stus("test1",&stu_b);

    cout << "stu_b.stu_num is " << stu_b.stu_num << endl;
    for(int i = 0;i < stu_b.stu_num;i++) {
        cout << "stu_b.stu_age[" << i << "] is " << stu_b.stu_age[i] << endl;
    }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...