gpt4 book ai didi

php - 在 php 循环中将数据写入 redis 时发生了有趣的事情

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

我写了一个 php 脚本来将数据从一台服务器(我们称之为服务器 A)拉到另一台服务器(服务器 B)。服务器A中的数据是一个redis列表,存储了所有需要写入服务器B的操作命令,如:

["setex",["session:xxxx",604800,"xxxx"]]
["set",["uid:xxx","xxxxx"]]
["pipeline",[]]
["set",["uid:xxx","xxxxx"]]
["hIncrBy",["Signin:xxxx","totalTimes",1]]
["pipeline",[]]
....

我的 php 代码是:

while($i < 1000){
$line = $redis['server_a']->rpop('sync:op');
list($op,$params) = json_decode($line,1);
$r = call_user_func_array(array($redis['server_b'], $op), $params);

$i++;
}

有线的是,当call_user_func_array方法错误执行redis命令时,队列中的所有剩余命令都无法正确写入服务器B。

为了寻求答案,我在这个问题上卡了将近一个星期。经过数千次测试后,我发现如果删除无法正确执行的“错误命令”,例如 ["pipeline",[]] 行。可以正确插入所有其他命令。所以它让我想起了一些redis交易问题。 也许有一些机制,当 redis 中的命令执行不当时,之后的所有其他命令都将被视为事务。所以我在 while 循环中添加了一个 exec() 命令:

 while($i < 1000){
$line = $redis['server_a']->rpop('sync:op');
list($op,$params) = json_decode($line,1);
$r = call_user_func_array(array($redis['server_b'], $op), $params);
$redis['server_b']->exec(); //this is the significant update
$i++;
}

然后,我的问题解决了!!!

我的问题是,谁能帮我解释一下redis的机制?我的假设是否正确?

最佳答案

无论出于何种原因,您的图书馆都可能正在使用事务进行流水线操作。 pipeline 不是真正的 Redis 命令,参见 http://redis.io/commands

只需删除所有带有空参数的pipeline 命令,或者在您之前发出pipeline 时只使用->exec

关于php - 在 php 循环中将数据写入 redis 时发生了有趣的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33735012/

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