redisアクセスバイナリデータ
3770 ワード
redisが提供するAPIでは、redisCommandArgvインタフェースはバイナリセキュリティであり、このインタフェースを利用してバイナリへのアクセスを実現することができます.次はテストコードです
#include
#include
#include
#include
#include
#include
#include
#include "hiredis.h"
struct st
{
int a;
int b;
char c;
int d;
};
void set(void)
{
struct st t;
t.a = 1;
t.b = 2;
t.c = 'a';
t.d = 4;
redisContext *c = redisConnect("127.0.0.1", 6379);
if (!c) {
printf("connect to redis fail
");
exit(1);
}
const char *v[3];
size_t vlen[3];
v[0] = "set";
vlen[0] = strlen("set");
v[1] = "c";
vlen[1] = strlen("c");
v[2] = (const char *)&t;
vlen[2] = sizeof(struct st);
redisReply *r = (redisReply *)redisCommandArgv(c, sizeof(v) / sizeof(v[0]), v, vlen);
if (!r) {
printf("empty reply
");
exit(1);
}
printf("reply: %s
", r->str);
freeReplyObject(r);
redisFree(c);
}
void get(void)
{
redisContext *c = redisConnect("127.0.0.1", 6379);
if (!c) {
printf("connect to redis fail
");
exit(1);
}
redisReply *r = (redisReply *)redisCommand(c, "get c");
if (!r) {
printf("empty reply
");
exit(1);
}
printf("reply length: %d
", r->len);
if (r->len != sizeof(struct st)) {
printf("reply len error
");
exit(-1);
}
struct st *p = (struct st *)malloc(sizeof(struct st));
if (!p) {
printf("malloc fail
");
exit(-1);
}
memcpy(p, r->str, r->len);
std::cout << "a:" << p->a
<< ", b:" << p->b
<< ", c:" << p->c
<< ", d:" << p->d
<< std::endl;
;
free(p);
freeReplyObject(r);
redisFree(c);
}
void zset(void)
{
struct st t;
t.a = 1;
t.b = 2;
t.c = 'a';
t.d = 4;
redisContext *c = redisConnect("127.0.0.1", 6379);
if (!c) {
printf("connect to redis fail
");
exit(1);
}
const char *v[4];
size_t vlen[4];
v[0] = "zadd";
vlen[0] = strlen("zadd");
v[1] = "d";
vlen[1] = strlen("d");
std::stringstream ss;
ss << time(0);
v[2] = ss.str().c_str();
vlen[2] = ss.str().size();
v[3] = (const char *)&t;
vlen[3] = sizeof(struct st);
redisReply *r = (redisReply *)redisCommandArgv(c, sizeof(v) / sizeof(v[0]), v, vlen);
if (!r) {
printf("empty reply
");
exit(1);
}
printf("reply: %s
", r->str);
freeReplyObject(r);
redisFree(c);
}
void zget(void)
{
redisContext *c = redisConnect("127.0.0.1", 6379);
if (!c) {
printf("connect to redis fail
");
exit(1);
}
redisReply *r = (redisReply *)redisCommand(c, "zrange d 0 -1");
if (!r) {
printf("empty reply
");
exit(1);
}
printf("reply length: %lu
", r->elements);
struct st *p = (struct st *)malloc(sizeof(struct st));
if (!p) {
printf("malloc fail
");
exit(-1);
}
for (size_t i = 0; i < r->elements; i++) {
printf("element length: %u
", r->element[i]->len);
if (r->element[i]->len != sizeof(struct st)) {
printf("reply len error
");
exit(-1);
}
memcpy(p, r->element[i]->str, r->element[i]->len);
std::cout << "a:" << p->a
<< ", b:" << p->b
<< ", c:" << p->c
<< ", d:" << p->d
<< std::endl;
;
}
free(p);
freeReplyObject(r);
redisFree(c);
}
int main(int argc, char **argv)
{
zset();
zget();
}