如何把c语言的结构体,直接存到redis里,然后再获取出来

应用场景。

针对线程内,进程内的数据共享。

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

#include <iostream>
#include <sstream>

#include <hiredis.h>

typedef struct st
{
    int a;
    int b;
    char c;
    int d;
} st;


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\n");
        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\n");
        exit(1);
    }

    printf("reply: %s\n", r->str);

    freeReplyObject(r);
    redisFree(c);
}

void get(void)
{
    redisContext *c = redisConnect("127.0.0.1", 6379);
    if (!c) {
        printf("connect to redis fail\n");
        exit(1);
    }

    redisReply *r = (redisReply *)redisCommand(c, "get c");
    if (!r) {
        printf("empty reply\n");
        exit(1);
    }

    printf("reply length: %d\n", r->len);
    if (r->len != sizeof(struct st)) {
        printf("reply len error\n");
        exit(-1);
    }

    struct st *p = (struct st *)malloc(sizeof(struct st));
    if (!p) {
        printf("malloc fail\n");
        exit(-1);
    }
    memcpy(p, r->str, r->len);


    printf("a=%d,b=%d,c=%c,d=%d\n",p->a,p->b,p->c,p->d);

    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\n");
        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();

    printf("ss===%s,%d\n",ss.str().c_str(),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\n");
        exit(1);
    }

    printf("reply: %s\n", r->str);

    freeReplyObject(r);
    redisFree(c);
}

void zget(void)
{
    redisContext *c = redisConnect("127.0.0.1", 6379);
    if (!c) {
        printf("connect to redis fail\n");
        exit(1);
    }

    redisReply *r = (redisReply *)redisCommand(c, "zrange d 0 -1");
    if (!r) {
        printf("empty reply\n");
        exit(1);
    }

    printf("reply length: %lu\n", r->elements);

    struct st *p = (struct st *)malloc(sizeof(struct st));
    if (!p) {
        printf("malloc fail\n");
        exit(-1);
    }
    size_t i = 0;
    for ( i = 0; i < r->elements; i++) {
        printf("element length: %u\n", r->element[i]->len);
        if (r->element[i]->len != sizeof(struct st)) {
            printf("reply len error\n");
            exit(-1);
        }

        memcpy(p, r->element[i]->str, r->element[i]->len);

        printf("a=%d,b=%d,c=%c,d=%d\n",p->a,p->b,p->c,p->d);
    }

    free(p);
    freeReplyObject(r);
    redisFree(c);
}




int main(int argc, char **argv)
{

    set();
    printf("#############set########################\n");
    get();
    printf("#############get########################\n");
    zset();
    printf("#############zset########################\n");
    zget();
    printf("##############zget#######################\n");

}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值