存档

文章标签 ‘zscan’

一个导出redis有序集合sorted-sets的shell脚本

2015年12月14日 没有评论
  1. 通过keys匹配需要导出的有序集合名称,这些集合命名格式为:*_010_09/Dec/2015
  2. 依次通过zscan导出有序集合中的数据,并分别保存

    #/bin/sh
    zset_pattern=”*_010_09/Dec/2015″
    keys=`redis-cli keys $zset_pattern`
    for k in $keys;do

    _date=`echo “$k”|awk -F”_” ‘{print $3}’|awk -F”/” ‘{print $3″_”$2″_”$1}’`
    out=`echo “$k”|awk -F”_” ‘{print $1″_”$2}’`”_$_date.txt”
    cursor=0

    batches=0
    while [ 1==1 ];do

    reply=`redis-cli zscan $k $cursor`
    cursor=`echo “$reply” | head -n 1`
    pairs=`echo “$reply”|tail -n +2`

    [ $cursor -eq 0 ] && [ $batches -gt 0 ] && break
    batches=`expr $batches + 1`

    skip_key=0
    echo “$pairs”|while read ms

    do

    #skip empty members
    [ “$ms” == “” ] && skip_key=1 && continue
    [ $skip_key -eq 1 ] && skip_key=0 && continue
    if [ “$m” == “” ];then

    m=$ms && continue

    fi
    if [ “$s” == “” ];then

    s=$ms
    echo “$m $s” >> $out
    m=”” && s=””

    fi

    done

    done

    done

分类: Redis, Shell 标签: , ,

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 标签: , , , , ,