近期使用 hiredis 库,用到了 pipeline 的方式,但是 pipiline 无法解决多客户端时可能操作同样 key 的竞争问题,想使用事务方式,但是不知道该怎么实现,有用过的朋友可以指点下么,谢谢了。 下面是用 redisAppendCommand 和 redisGetReply 实现的 pipeline 方式
//输入命令写入缓冲区
int nCmdCount = vecPipelineCmd.size();
for (int i = 0; i < nCmdCount; i++)
{
redisAppendCommand(m_pContext, vecPipelineCmd[i].c_str());
}
//批量发送命令并获取批量回复结果,redisGetReply 的调用次数必须和 redisAppendCommand 一致
nSuccessCnt = 0;
for (int i = 0; i < nCmdCount; i++)
{
bool bStatus = false;
string strRsp("");
redisReply* reply = NULL;
if(redisGetReply(m_pContext, (void**)&reply) == REDIS_OK && reply != NULL && reply->type == REDIS_REPLY_STRING)
{
bStatus = true;
strRsp = reply->str;
nSuccessCnt++;
}
//释放 reply 的内存空间
freeReplyObject(reply);
vecPipelineStatus.push_back(bStatus);
vecPipelineRsp.push_back(strRsp);
}