当前位置:编程学习 > C/C++ >>

google protocol buffer 与 redis 结合使用

google protocol buffer 可以将对象序列化,而redis作为优秀的NOSQL数据库,这里我将以实例方式介绍,将C++对象序列化,并存放在redis数据库中!
 
 
 
google protocol buffer 的安装以及基础使用可以阅读我上一片文章.
 
redis的安装使用,可以查阅,这里不再描述.我使用redis的官方C client: hiredis.
 
 
 
protobuf 对象模型:
 
[cpp] 
package cn.vicky.model.seri;  
  
message User {  
    required int32 id = 1; // 主键,唯一  
    required string username = 2; // 帐号  
    required string password = 3; // 密码  
    optional string email = 4; // 邮箱(可选)  
    repeated Person person = 5; // 账户拥有的角色(可以重复)  
}  
  
message Person {   
    required int32 id = 1; // 主键,唯一  
    required string name = 2; // 角色名字  
  
    repeated PhoneNumber phone = 3; // 电话号码(可以重复)  
}   
  
// 枚举类型  
enum PhoneType {   
    MOBILE = 0;   
    HOME = 1;   
    WORK = 2;   
}   
  
message PhoneNumber {   
    required string number = 1;   
    optional PhoneType type = 2 [default = HOME];   
}   
 
 
 
创建工程:
 
在生成对应的model.pb.h  model.pb.cc 更多请阅读我上一篇文章.
 
将hiredis.h以及依赖库引入项目中.这里以静态链接库形式  /usr/lib/libhiredis.a
 
编写main,cpp
 
[cpp] 
/*  
 * File:   main.cpp 
 * Author: Vicky.H 
 * Email:  eclipser@163.com 
 */  
#include <iostream>  
#include <fstream>  
#include "model.pb.h"  
#include "hiredis.h"  
  
/* 
 *  
 */  
int main(void) {  
  
    // 创建User对象  
    cn::vicky::model::seri::User u;  
    u.set_id(1);  
    u.set_username("Jack");  
    u.set_password("123456");  
    u.set_email("289997171@qq.com");  
  
    // 创建User中的一个角色  
    cn::vicky::model::seri::Person* _person1 = u.add_person();  
    _person1->set_id(1);  
    _person1->set_name("P1");  
  
    // 创建角色中的一个电话号码:1  
    cn::vicky::model::seri::PhoneNumber* _phone1 = _person1->add_phone();  
    _phone1->set_number("+8613618074943");  
    _phone1->set_type(cn::vicky::model::seri::MOBILE);  
  
    // 创建角色中的一个电话号码:2  
    cn::vicky::model::seri::PhoneNumber* _phone2 = _person1->add_phone();  
    _phone2->set_number("02882334717");  
    _phone2->set_type(cn::vicky::model::seri::WORK);  
  
  
    // 创建User中的一个角色  
    cn::vicky::model::seri::Person* _person2 = u.add_person();  
    _person2->set_id(2);  
    _person2->set_name("P2");  
  
    // 创建角色中的一个电话号码:1  
    cn::vicky::model::seri::PhoneNumber* _phone3 = _person2->add_phone();  
    _phone3->set_number("+8613996398667");  
    _phone3->set_type(cn::vicky::model::seri::MOBILE);  
  
    // 创建角色中的一个电话号码:2  
    cn::vicky::model::seri::PhoneNumber* _phone4 = _person2->add_phone();  
    _phone4->set_number("02882334717");  
    _phone4->set_type(cn::vicky::model::seri::WORK);  
  
  
    // 将对象以二进制保存  
    const int byteSize = u.ByteSize();  
    std::cout << "byteSize = " << byteSize << std::endl;  
    char buf[byteSize];  
    bzero(buf, byteSize);  
    u.SerializeToArray(buf, byteSize);  
  
  
    // 建立redis链接  
    redisContext *c;  
    redisReply *reply;  
  
    struct timeval timeout = {1, 500000}; // 1.5 seconds  
    c = redisConnectWithTimeout((char*) "127.0.0.1", 3307, timeout);  
    if (c->err) {  
        printf("Connection error: %s\n", c->errstr);  
        exit(1);  
    }  
  
//    第一次执行:将对象写入redis数据库  
//    reply = (redisReply*) redisCommand(c, "SET %b %b", u.username().c_str(), (int) u.username().length(), buf, byteSize); // 重点!!!  
//    printf("SET (binary API): %s\n", reply->str);  
//    freeReplyObject(reply);  
  
//    第二次执行:从redis数据库读取对象数据  
    reply = (redisReply*) redisCommand(c, "Get Jack");  
    std::cout << "reply->len = " << reply->len << "\nreply->str : \n" << reply->str << std::endl; // 这里打印不完  
  
    std::cout << "---------------------------" << std::endl;  
  
    cn::vicky::model::seri::User u2;  
    u2.ParseFromArray(reply->str, reply->len);  
  
    std::cout << u2.id() << std::endl;  
    std::cout << u2.username() << std::endl;  
    std::cout << u2.password() << std::endl;  
    std::cout << u2.email() << std::endl;  
  
    std::cout << "---------------------------" << std::endl;  
    for (int i = 0; i < u2.person_size(); i++) {  
        cn::vicky::model::seri::P
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,