google protocol buffer 与 redis 结合使用(一)

2014-11-24 08:23:37 · 作者: · 浏览: 3
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
#include
#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 timeva l 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, by