gpt4 book ai didi

使用 call_user_func_array 插入时 redis 丢失 key

转载 作者:可可西里 更新时间:2023-11-01 11:20:27 24 4
gpt4 key购买 nike

我试图将 10K 个元素放入一个数组中,并尝试使用 call_user_func_array 将它们添加到 redis set 中,但我得到了一个非常奇怪的结果。

这是代码:

$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参数有关。将 rand 更改为 rand(1,10),将插入 10 个项目。如果我一起删除 rand() 并将其替换为 $i(因此数组中的每个元素都会递增),它会起作用,并且将 10K 推送到 redis 'test:0' 集。

知道为什么会这样吗?

更新 1:

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

更新 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

最佳答案

您正在使用 sadd,它正在添加要设置的值。 Set 仅包含不同的值。例如,在 rand(10,14) 的情况下,您只有 5 个不同的值,即 10,11,12,13,14 scard(计数),该不同值是 5。http://redis.io/commands/sadd

如果你想推送所有元素而不考虑重复条目,你应该使用列表。 IE。 lpush 或 rpush 命令。推送后,您可以使用 llen 查看插入的值的数量。它将是10K。 http://redis.io/commands/llen

关于使用 call_user_func_array 插入时 redis 丢失 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37589541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com