hiredis处理zscan和hscan的reply

时间:2024-09-10 19:04:44

  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);

      redisReply ** siteCounters=reply->element[1]->element;
      for(size_t i=0; i<reply->element[1]->elements; i++)
      {
        string elem = siteCounters[i++]->str;
        string score = siteCounters[i]->str;

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

}

  hscan和zscan api的用法是一样的。

  本文转自我的个人博客“零一积流”,原链接在这里:http://www.it-refer.com/2015/11/06/hiredis-zscan-hscan-reply/