我正在尝试将10K元素推入数组并尝试使用call_user_func_array将它们添加到redis集中,但是我得到了一个非常奇怪的结果。
这是代码:
$redis = new Redis();
$redis->connect('127.0.0.1',6380);
$list_id=0;
$test_ar = array();
for($i=0;$i<10000;$i++){
$test_ar[]=rand(1,4);
}
echo "test array cnt: ".count($test_ar)." \n";
array_unshift($test_ar, 'test:'.$list_id);
echo "array chunk: ".print_r(array_slice($test_ar, 0, 10),true)." \n";
call_user_func_array(array($redis, 'sAdd'), $test_ar);
$test_cnt = $redis->scard('test:'.$list_id);
echo "test_cnt : $test_cnt \n";
这是输出:
test array cnt: 10000
array chunk: Array
(
[0] => test:0
[1] => 2
[2] => 4
[3] => 2
[4] => 4
[5] => 3
[6] => 4
[7] => 2
[8] => 3
[9] => 4
)
test_cnt : 4
只插入了4个项目? 似乎插入的项目数与rand参数有关。将兰特改为兰德(1,10),将插入10个项目。如果我一起删除rand()并将其替换为$ i(因此数组中的每个元素都会递增),它就可以工作,并且10K被推送到redis&#39; test:0&#39;集。
知道为什么会这样吗?
我将随机更改为rand(10,14),并插入了5个项目。所以它似乎与参数的范围有关,就是兰特。
我将随机更改为:
$test_ar[]=(mt_rand() / mt_getrandmax())*20;
并插入了所有10K项目:
test array cnt: 10000
array chunk: Array
(
[0] => test:0
[1] => 4.6265427696642
[2] => 4.6970932580051
[3] => 13.528551176902
[4] => 3.0136572117981
[5] => 6.1535581602499
[6] => 2.2943511802211
[7] => 6.6211488128738
[8] => 5.5308832533336
[9] => 6.9294742527089
)
test_cnt : 10000
答案 0 :(得分:1)
您正在使用sadd添加值来设置。 Set仅包含不同的值。例如,在rand(10,14)的情况下,你只有5个不同的值,即10,11,12,13,14那个不同值的scard(count)是5. http://redis.io/commands/sadd
如果您想要推送所有元素而不管重复条目,您应该使用列表。即。 lpush或rpush命令。推后,您可以使用llen查看插入的值的数量。它将是10K。 http://redis.io/commands/llen