c++使用redis个人总结

前段时间c++项目需要使用缓存替换mysql,因为要持久化,而没有选择项目中只用过的memcache,选择了redis。

客户端代码选择hiredis,版本应该是最新的,记不清(放到资源中)。

这些源码需要封装,要不使用起来麻烦。(竟然没法上传文件作为附件???,只能放到资源里)

简单记录下项目使用方式:

master作为增删操作的对象,slave只负责读,redis集群实时同步,持久化方式为AOF,配置文件贴图

并且仅开启AOF,RDB关闭,贴图

c++使用redis个人总结_第1张图片

注意这里,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;
}
                                                                                                                                  




你可能感兴趣的:(redis)