使用call_user_func_array插入时redis丢失密钥

时间:2016-06-02 10:41:21

标签: redis

我正在尝试将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;集。

知道为什么会这样吗?

更新1:

我将随机更改为rand(10,14),并插入了5个项目。所以它似乎与参数的范围有关,就是兰特。

更新2:

我将随机更改为:

$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

1 个答案:

答案 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