redis mysql 封装_redis数据库操作的C++简单封装

#include "redis_handler.h"#include#include#include

using namespacestd;

RedisHandler::RedisHandler()

{

m_addr= "";

m_port= 0;

m_pwd= "";

pm_rct=NULL;

pm_rr=NULL;

error_msg= "";

}

RedisHandler::~RedisHandler()

{

disConnect();

pm_rct=NULL;

pm_rr=NULL;

}/*连接redis数据库

addr: 地址,port:端口号,pwd:密码

成功返回M_REDIS_OK,失败返回M_CONNECT_FAIL*/

int RedisHandler::connect(const string &addr = "127.0.0.1", int port = 6379, const string &pwd) {

m_addr=addr;

m_port=port;

m_pwd=pwd;

pm_rct=redisConnect(m_addr.c_str(), m_port);if (pm_rct->err)

{

error_msg= pm_rct->errstr;returnM_CONNECT_FAIL;

}if (!m_pwd.empty())

{returnconnectAuth(m_pwd);

}returnM_REDIS_OK;

}/*断开redis连接*/

intRedisHandler::disConnect()

{

redisFree(pm_rct);

freeReplyObject(pm_rr);

}/*添加或插入键值对

key:键,value:值

成功返回M_REDIS_OK,失败返回<0*/

int RedisHandler::setValue(const string &key, const string &value)

{string cmd = "set" + key + " " +value;

pm_rr= (redisReply*)redisCommand(pm_rct, cmd.c_str());returnhandleReply();

}/*获取键对应的值

key:键,value:值引用

成功返回M_REDIS_OK,失败返回<0*/

int RedisHandler::getValue(const string &key, string &value)

{string cmd = "get" +key;

pm_rr= (redisReply*)redisCommand(pm_rct, cmd.c_str());int ret = handleReply(&value);

}/*删除键

key:键

成功返回影响的行数(可能为0),失败返回<0*/

int RedisHandler::delKey(const string &key)

{string cmd = "del" +key;

pm_rr= (redisReply*)redisCommand(pm_rct, cmd.c_str());int rows = 0;int ret = handleReply(&rows);if (ret ==M_REDIS_OK)returnrows;else

returnret;

}/*打印所有键值对到屏幕上*/

intRedisHandler::printAll()

{string cmd = "keys *";

pm_rr= (redisReply*)redisCommand(pm_rct, cmd.c_str());intlen ;

redisReply**array;int ret = handleReply(&len, &array);if (ret ==M_REDIS_OK)

{for (int i = 0; i < len; i++)

cout<< string(array[i]->str) <

}else

return 0;

}/*返回错误信息*/

stringRedisHandler::getErrorMsg()

{returnerror_msg;

}/*使用密码登录

psw:登录密码

成功返回M_REDIS_OK,失败返回<0*/

int RedisHandler::connectAuth(const string &psw)

{string cmd = "auth" +psw;

pm_rr= (redisReply*)redisCommand(pm_rct, cmd.c_str());returnhandleReply();

}/*处理redis返回的信息

value:数据指针,用于保存redis返回的基本类型(value指针指向该数据)

array:数组指针,用于保存redis返回的数组

成功返回M_REDIS_OK,失败返回<0*/

int RedisHandler::handleReply(void* value, redisReply***array)

{if (pm_rct->err)

{

error_msg= pm_rct->errstr;returnM_CONTEXT_ERROR;

}if (pm_rr ==NULL)

{

error_msg= "auth redisReply is NULL";returnM_REPLY_ERROR;

}switch (pm_rr->type)

{caseREDIS_REPLY_ERROR:

error_msg= pm_rr->str;returnM_EXE_COMMAND_ERROR;caseREDIS_REPLY_STATUS:if (!strcmp(pm_rr->str, "OK"))returnM_REDIS_OK;else{

error_msg= pm_rr->str;returnM_EXE_COMMAND_ERROR;

}caseREDIS_REPLY_INTEGER:*(int*)value = pm_rr->integer;returnM_REDIS_OK;caseREDIS_REPLY_STRING:*(string*)value = pm_rr->str;returnM_REDIS_OK;caseREDIS_REPLY_NIL:*(string*)value = "";returnM_REDIS_OK;caseREDIS_REPLY_ARRAY:*(int*)value = pm_rr->elements;*array = pm_rr->element;returnM_REDIS_OK;default:

error_msg= "unknow reply type";returnM_EXE_COMMAND_ERROR;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最近重构并优化了一套后端服务的代码: 1. 设计并开发高效的C++对象池算法,时间复杂度为 O(1) 在整个重构框架中,对象池是负责管理内存的底层基本模块 2. 利用命令模式的思想开发 Redis 子模块 抽象出方便高效的接口提供给上层程序员使用 3. 利用组合模式和装饰模式的思想开发 MongoDB 数据库查询条件装饰器 将查询条件和数据库 MongodbModule 数据模型进行解耦合 4. 抽象出一套 MongoDB Module 结果集接口 通过模板和特化技术实现 string/int 等不同索引类型的结果集 5. 开发 AbstractMongodbModule 类处理通用的 MongoDB 数据库表数据操作 数据库中不同的表都有自己的 AbstractMongodbModule 子类对应 6. 用 Perl 开发自动代码生成器,上层程序员对照数据库表结构写 .tmpl 配置文件, 自动生成该数据库表的 MongodbModule 子类,减轻程序员新增表时的工作量 7. 结合 Redis 模块和 MongoDB 模块,开发 HierarchicalModule 分层数据模型 构造一个 Redis 缓存层 + MongoDB 持久层的后台 Server 架构 并通过简单方便的接口供上层程序员使用,具体的数据分层处理对上层程序员是黑盒的 8. 设计并开发整套缓存层使用的 KEY 规则,方便缓存更新 结合公司的数据订阅系统进行 Redis缓存层 + MongoDB 持久层数据更新功能 9. 重构后的分层数据架构比原有接口效率提高 5 - 400 倍(返回数据记录条数从 150 - 5 条) 绝大部分时间后端接口需要获取记录个数在 50 以内,所以效率提升在 100 倍左右
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值