有序集合zset中判断value是否存在可以使用zrank

创建了一个Zset (fund.info) ,在对fund.info使用zadd(“thisisatest”)之前,先检查fund.info里面是否已存在value值为"this is a test"的member;

我首先从网上搜索相关的信息,没找到多少消息。

只 找到了 基于JAVA  :http://blog.csdn.net/sparkexpert/article/details/78351558

刚开始我参考他的作法使用zrank进行判断

// 比较strzsetvalue在zset 中的排位,如果>=0,则说明存在

        if (pClient->zrank("fund.info","thisisatest") >= 0)
        {
        }
        else  // 反之则不存在
        {
            pClient->zadd("fund.info",100.00,"thisisatest");
        }

这里出现了一个问题,当我的fund.info不存在“thisisatest”时,zrank()函数会直接报错“unexpected prefix for integer reply”;
这个问题还不清楚原因,有大神帮忙解释下嘛?

下面贴出我的解决办法:

PS:我的解决办法只用来判断fund.info最后一个member和要插入的值是否匹配重复。如果你想与fund.info的全部member匹配重复,可以通过循环来匹配;

bool isRepeatData = false;

// 先判断fund.info是否存在member

    if (pClient->zcard("fund.info") > 0)
    {
        std::vector<std::string>  vSecondDataEx;
        pClient->zrange(strZsetName,-1,-1,vSecondDataEx); // 取最后的member
        if (vSecondDataEx[0] == "thisisatest")   // 用最后的member的value值与要插入的value值比较
        {
            isRepeatData = true;
        }
    }
    if (isRepeatData) // 如果是重复数据则直接返回
    {
        return  ;
    }
    pClient->zadd("fund.info",100.00,"thisisatest");

php 版本不存在的话会直接返回false
所以可以直接判断

    $res = redis()->zRank(Consult::ASK_COMMON_PAY_ZSET, $uid.'_'.$phone);
    if ($res === false) {
        redis()->zAdd(Consult::ASK_COMMON_PAY_ZSET, time() + 86400, $uid.'_'.$phone);
    }

您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站大部分内容收集于互联网,如果有侵权内容、不妥之处,请联系删除。敬请谅解!

添加新评论

  关于博主【WANG-FEiHU】

Duplicate
-----------Complicate
--------------------------Appreciate
-----------------------------------------Fate

闻先后,术专攻
三人有师
习得文武艺,货与帝王家
人性不曾变,资本永无眠

-----------花有重开日,人无再少年-----------

  分类目录

  monitor(TD)

青春就是用来追忆的,当你怀揣着它时,它一文不值,只有将它耗尽后,再回过头看,一切才有了意义,爱过我们的人和伤害过我们的人,都是我们青春存在的意义。

在这有限的时间里,我们应该珍惜生命,珍惜机会,更要珍惜那得之不易的时间。因那滴答做响的时间脚步,一旦走过,再不回头。

要打败任何事情得先学会打败自己。

我会把每一次改变当做成长,哪怕是痛也值得。

时无英雄,使竖子成名

少年不识愁滋味,爱上层楼。爱上层楼。为赋新词强说愁。而今识尽愁滋味,欲说还休。欲说还休。却道天凉好个秋。