查询Redis获取Laravel Horizon待处理任务时zRange返回空数组问题
解决Laravel Horizon待处理任务Redis zRange返回空数组的问题
以下是几个你可能忽略的基础问题及解决办法:
确认Redis连接是否正确
Laravel允许配置多个Redis连接(比如默认、缓存、Horizon专用),Horizon的任务数据大概率存在单独的连接里。如果你的代码用了默认Redis连接,自然查不到Horizon的数据。
解决:指定Horizon连接调用方法,示例代码:Redis::connection('horizon')->zRange('laravel_horizon:pending_jobs', 0, -1, true);先检查
config/database.php里的redis配置项,或者config/horizon.php中指定的redis连接名。检查Redis键名前缀
如果你的Laravel配置了Redis键前缀(.env里的REDIS_PREFIX),PhpStorm里看到的是带前缀的完整键名,但你代码里可能用了不带前缀的原始键名。比如前缀是myapp_,实际键名是myapp_laravel_horizon:pending_jobs,直接查laravel_horizon:pending_jobs会返回空。
解决:要么使用带前缀的完整键名,要么临时去掉前缀查询:Redis::connection('horizon')->prefix('')->zRange('laravel_horizon:pending_jobs', 0, -1, true);检查zRange方法的参数格式
Laravel Redis门面的zRange方法,第四个参数是布尔值(是否返回分数),如果你错误传入了字符串'withscores'(像原生Redis命令那样),会导致参数解析错误,返回空数组。
正确调用方式:// 返回带分数的数组 Redis::zRange('laravel_horizon:pending_jobs', 0, -1, true); // 只返回值 Redis::zRange('laravel_horizon:pending_jobs', 0, -1);验证键的数据类型
虽然你在PhpStorm里看到是sorted set,但可以在代码里先验证键的类型,避免键名重名导致的类型不匹配:// 应该返回字符串'zset' dd(Redis::connection('horizon')->type('laravel_horizon:pending_jobs'));
内容的提问来源于stack exchange,提问作者Sonny
相关产品推荐
相关产品推荐

