Redis SCARD返回错误结果?

3

我正在向Redis集合中添加大量的数据点:

$t = 0;
$redis = Redis::Connection();
foreach($adv as $a) {
    $t = $t + 1;
    print($t); //Prints to log

    $test = $redis -> sadd('database/ab/AL', $a -> id);
    print($test); //Prints to log
}

当我调用redis->scard('database/ab/AL')时,我得到了结果9832,而我应该得到的答案是9866$t是我放置的一个计数器,用来检查循环执行了多少次,运行循环后,$t9866,这很奇怪,因为scard返回的是9832
然后我想也许有重复添加,所以我记录了sadd的响应。
1 [2015-06-29 16:24:55] local.INFO: 1 [] []
2 [2015-06-29 16:24:55] local.INFO: 1 [] []
3 [2015-06-29 16:24:55] local.INFO: 1 [] []
4 [2015-06-29 16:24:55] local.INFO: 1 [] []
5 [2015-06-29 16:24:55] local.INFO: 1 [] []
6 [2015-06-29 16:24:55] local.INFO: 1 [] []
...
9861 [2015-06-29 16:24:59] local.INFO: 1 [] []
9862 [2015-06-29 16:24:59] local.INFO: 1 [] []
9863 [2015-06-29 16:24:59] local.INFO: 1 [] []
9864 [2015-06-29 16:24:59] local.INFO: 1 [] []
9865 [2015-06-29 16:24:59] local.INFO: 1 [] []
9866 [2015-06-29 16:24:59] local.INFO: 1 [] []

整个日志中没有零,这意味着每个被添加的元素都是唯一的。此外,9866 条日志调用与 scard 结果相矛盾。 我已经尝试使用 redis-cli 进行检查,但仍然得到错误的结果。 这是怎么回事?

1
你是否在注释掉流水线的情况下记录了 SADD 的响应?我几乎可以确定你有重复项,并且计数是正确的,但在这种情况下,流水线可能会影响响应。 - Itamar Haber
建议:在运行代码之前,在与数据库不同的连接中运行“MONITOR”。这将显示所有正在进行的命令...捕获它,从中很容易看出哪里出了问题。 - Itamar Haber
是的,我已经尝试了很多次,每次都得到相同的“9832”结果。到目前为止,这是唯一返回此结果的表格。表格中没有重复项,但是当我运行原始SQL查询时,确实有“9866”行。 - RN_
1
@vp_arth 我应该这样做的,但是我修改了我发布的代码以简化它。下次我不会这样做了。现在我有两个错误要吸取教训 :) - RN_
1
我只是有点生气 :) 我取消了我的踩。这再次证明,没有奇迹。 - vp_arth
显示剩余8条评论
1个回答

2

我实际上是在使用变量键入值:

$redis->sadd('database/ab/state:'.$a->state, a->id);

结果有些状态是小写的,这导致了那些值被发送到另一个键。

修复方法:$redis->sadd('database/ab/state:'.strtoupper($a->state), a->id);

当我调用SCARD时,现在我得到了正确的数字9866

始终仔细检查您的键名!


我用大量的测试破坏了我的Redis,但你在问题中只是撒谎。请始终在SO问题中提供实际的代码。 - vp_arth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接