存档

文章标签 ‘hiredis’

hiredis处理zscan和hscan的reply

2015年11月6日 没有评论

zscan的返回值可以看做是一个二维数组,第一维包含两个元素:string类型的游标cursor和集合元素数组;第二维即集合元素数组,这个数组交替存放着集合元素和score,元素和score也都是string类型的。当然所有的值都是通过指针来引用的,所以使用时务必小心。

当cursor为0时表示,扫描结束;非0的cursor值用来进行后续扫描。

集合元素数组reply->elements指示当前数组中包含多少个元素(指针),据此来遍历整个数组。

示例代码如下:

//cLocal points to the local redis

llCursor=0;

done=false;

while(!done)

{

cmd=”zscan “+setName+” %lld count 10″;
reply = (redisReply *)redisCommand(cLocal, cmd.c_str(), llCursor);
if(reply == NULL)
{
cout << “scan ” << setName << “failed, error is: ” << cLocal->errstr;
redisFree(cLocal);
cLocal = NULL;
break;
}

if(reply->type == REDIS_REPLY_ARRAY)
{
if(reply->elements == 0)
{
done=true;
cout << “get 0 msg from ” << setName;
}
else
{
llCursor=boost::lexical_cast<long long>(reply->element[0]->str);  //reply->element[0] contains cursor

redisReply ** siteCounters=reply->element[1]->element;               //reply->element[1] contains elements array:value1,score1,value2,score2,…
for(size_t i=0; i<reply->element[1]->elements; i++)
{
string elem = siteCounters[i++]->str;
string score = siteCounters[i]->str;

}
if(llCursor == 0)  //scan over
{
done=true;
}
}
}
else
{
done=true;
}
freeReplyObject(reply);

}

hscan和zscan api的用法一样。

分类: C/C++, Redis 标签: , , , , ,

Hiredis: redis c client使用注记

2015年9月17日 没有评论
  1. 编译
  2. 使用
    • 初始化
    • 连接redis数据库

      redisContext * pConn = redisConnect(redisIp.c_str(), redisPort);
      if (m_cLocal == NULL)
      {
      return 1;
      }

      if(pConn->err)
      {
      cout << “Connection to redis[” << redisIp << “] error: ” << pConn->errstr;
      redisFree(pConn);
      return 2;
      }

    • 执行命令

      string cmd=”set foo bar;
      redisReply * reply=(redisReply *)redisCommand(pConn, cmd.c_str());
      if(reply == NULL)
      {
      cout << “redis[” << redisIp << “] excute ” << cmd << ” failed, error is: ” << pConn->errstr;
      redisFree(pConn);
      pConn=NULL;
      return 3;
      }
      freeReplyObject(reply);

    • 解析结果
      • 不同的命令返回不同类型的结果,需要根据reply->type字段进行解析
      • reply->type主要有以下6种,可嵌套,比如array类型的结构中包含指向其他array的指针

        #define REDIS_REPLY_STRING 1
        #define REDIS_REPLY_ARRAY 2
        #define REDIS_REPLY_INTEGER 3
        #define REDIS_REPLY_NIL 4
        #define REDIS_REPLY_STATUS 5
        #define REDIS_REPLY_ERROR 6

      • 由于返回结果通过指针来引用,操作时需要格外小心
  3. 注意事项
  • Once an error is returned the context cannot be reused and you should set up a new connection.

上面示例中执行命令时,如果返回了错误,则连接不可用,需要重新建立连接。

  • redisCommand这个函数的用法应参照c中的printf。上面示例中,如果cmd中含%,特别要引起注意!
分类: C/C++, Redis, 数据库, 资料 标签: , , , ,