【问题标题】:Redis SCARD returning the wrong results?Redis SCARD 返回错误的结果?
【发布时间】:2015-06-29 16:44:00
【问题描述】:

我正在将大量数据点添加到 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 是我放入的计数器,用于检查循环正在执行多少次迭代,而 $t 在运行循环后是 9866,考虑到 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 检查,但仍然得到错误的结果。 什么给了?

【问题讨论】:

  • 您是否记录了 SADD 响应并同时注释掉了流水线?我几乎可以肯定你有重复并且计数是正确的,但是在这种情况下流水线可能会混淆响应
  • 是的,这些结果是在没有流水线的情况下取得的。我删除了评论部分以避免混淆。我确定没有重复项(尽管我可能是错的)。我正在迭代的数据 $adv 来自带有 DISTINCT 修饰符的 SQL 查询
  • 建议:在运行代码之前,在与数据库的不同连接中运行MONITOR。这将向您显示所有冲进来的命令...捕获它,应该相当简单地查看哪里出了问题。
  • @vp_arth 我绝对应该有,但为了简单起见,我修改了我发布的代码。下次我不会那样做。我现在有两个错误要学习:)
  • 我只是有点生气 :) 我删除了我的反对票。另一个证明,没有奇迹。

标签: php redis predis


【解决方案1】:

我实际上是用一个变量来键入值:

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

原来有些状态是小写的,这会将这些值发送到另一个键。

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

现在当我拨打SCARD时,我得到了正确的号码9866

始终仔细检查您的键名!

【讨论】:

  • 我用大量测试破坏了我的redis,但你只是在问题上撒了谎。 Always provide actual code in the SO questions
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多