前段时间c++项目需要使用缓存替换mysql,因为要持久化,而没有选择项目中只用过的memcache,选择了redis。
客户端代码选择hiredis,版本应该是最新的,记不清(放到资源中)。
这些源码需要封装,要不使用起来麻烦。(竟然没法上传文件作为附件???,只能放到资源里)
简单记录下项目使用方式:
master作为增删操作的对象,slave只负责读,redis集群实时同步,持久化方式为AOF,配置文件贴图
并且仅开启AOF,RDB关闭,贴图
注意这里,save ""。
其实,可以同事开启AOF与RDB,但是参考了几篇文章,RDB可能会影响redis性能,恢复数据太慢。
业务代码使用记录:
mRedisDao.initialize(msRMaster, miRPort, miRTimeOut, miRExpire, msRPasswd)初始化
添加redis数据,使用master,有实效时间。
int clsBusiRedisDao::addValue(redisValue value)
{
clsRedisConnMgr* pConn = clsRedisConnMgr::getInstance();
redisHandle rh = NULL;
if (pConn)
{
rh = pConn->getMaster();
if (rh == NULL)
{
gvLog(LOG_ERR_SYS, "ERR: clsBusiRedisDao::addValue get master failed.");
return -300001;
}
}
else
{
gvLog(LOG_ERR_SYS, "ERR: clsBusiRedisDao::addValue get connection failed.");
return -300002;
}
char lsCommand[1024] = "\0";
snprintf(lsCommand, sizeof(lsCommand), "SET %s %s$#$%s EX %d", value.msgid.c_str(), value.phone.c_str(), value.
category.c_str(), miRExpire);
int liRet = mRedisDao.setCommand(rh, lsCommand);
if (liRet < 0)
{
gvLog(LOG_ERR_SYS, "ERR: clsBusiRedisDao::addValue set command failed, command=%s, errno=%d",lsCommand,liRe
t);
liRet = -300003;
}
pConn->disConn(rh);
return liRet;
}
get 缓存value,使用slave
int clsBusiRedisDao::getValue(const std::string &key, redisValue& value)
{
std::string lsCommand = "GET ";
lsCommand.append(key);
std::vector rl;
clsRedisConnMgr* pConn = clsRedisConnMgr::getInstance();
redisHandle rh = NULL;
if (pConn)
{
rh = pConn->getSlave();
if (rh == NULL)
{
gvLog(LOG_ERR_SYS, "ERR: clsBusiRedisDao::getValue get slave handler failed.");
return -21000;
}
} else {
gvLog(LOG_ERR_SYS, "ERROR: clsBusiRedisDao::getValue get connect manager failed.");
return -22000;
}
int liRet = mRedisDao.getCommand(rh, lsCommand, rl);
if (liRet < 0)
{
gvLog(LOG_ERR_SYS, "ERROR: clsBusiRedisDao::getValue get command failed, errno=%d",liRet);
} else if (liRet == 0){
liRet = 0;
} else {
liRet = parseString(rl[0].c_str(), value);
if (liRet < 0)
{
gvLog(LOG_ERR_SYS, "ERROR: clsBusiRedisDao::getValue parse command failed, result=%s,errno=%d",rl[0].c_str(), liRet);
} else {
liRet = 1;
}
}
pConn->disConn(rh);
return liRet;
}