Я решил это с помощью вложенного * списка 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;
}
}