又是一个坑人的大坑。
之前遇到的问题是在设置密码的时候,不是用户名和密码,需要把用户名和密码用冒号串起来写进去进行认证。
我们用的是阿里去的ecs和redis,用的是laravel框架,里面有用到Job,以队列的方式在执行:
ProductUpdateJob::dispatch($product);
结果任务死活发布不到Redis的List里,对应的Job也没有运行。
后面一步步的跟到Laravel的框架里: vendor/laravel/framework/src/Illuminate/Redis/Connections/Connection.php
public function command($method, array $parameters = [])
{
var_dump($method, $parameters);
$start = microtime(true);
$result = $this->client->{$method}(...$parameters);
$time = round((microtime(true) - $start) * 1000, 2);
if (isset($this->events)) {
$this->event(new CommandExecuted($method, $parameters, $time, $this));
}
return $result;
}
输出:
string(4) "eval"
array(3) {
[0]=>
string(153) "-- Push the job onto the queue...
redis.call('rpush', KEYS[1], ARGV[1])
-- Push a notification onto the "notify" queue...
redis.call('rpush', KEYS[2], 1)"
[1]=>
array(3) {
[0]=>
string(14) "queues:default"
[1]=>
string(21) "queues:default:notify"
[2]=>
string(579) "{"uuid":"5b31adf4-4646-4435-a13e-9940450261da","displayName":"App\\Jobs\\TestJob","job":"Illuminate\\Queue\\CallQueuedHandler@call","maxTries":null,"maxExceptions":null,"backoff":null,"timeout":null,"retryUntil":null,"data":{"commandName":"App\\Jobs\\TestJob","command":"O:16:\"App\\Jobs\\TestJob\":10:{s:3:\"job\";N;s:10:\"connection\";N;s:5:\"queue\";N;s:15:\"chainConnection\";N;s:10:\"chainQueue\";N;s:19:\"chainCatchCallbacks\";N;s:5:\"delay\";N;s:11:\"afterCommit\";N;s:10:\"middleware\";a:0:{}s:7:\"chained\";a:0:{}}"},"id":"H97AvylnadgDi2Vp8eA0ieXiNxrgY8Ok","attempts":0}"
}
[2]=>
int(2)
}
发现里面用的是eval命令执行的rpush。
最后在redis里用命令执行eval,结果发现没有这个权限运行:
eval "redis.call('rpush', KEYS[1], ARGV[1])\nredis.call('rpush', KEYS[2], 1)" "queues:default" "queues:default:notify"
返回:
"ERR command eval not support for your account"
最后联系阿里的客服,建议我们升级Redis的版本后,问题就好了。