【发布时间】: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 我绝对应该有,但为了简单起见,我修改了我发布的代码。下次我不会那样做。我现在有两个错误要学习:)
-
我只是有点生气 :) 我删除了我的反对票。另一个证明,没有奇迹。