又是一个坑人的大坑。
之前遇到的问题是在设置密码的时候,不是用户名和密码,需要把用户名和密码用冒号串起来写进去进行认证。
我们用的是阿里去的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的版本后,问题就好了。