
在 Docker 中运行 Celery + Redis 时,redis-cli llen celery 返回 0 并非队列为空,而是因连接参数(如数据库编号、主机名)与实际服务不匹配所致;正确做法是使用服务名 redis 并指定数据库 0,而非 localhost 和 -n 1。
在 docker 中运行 celery + redis 时,`redis-cli llen celery` 返回 0 并非队列为空,而是因连接参数(如数据库编号、主机名)与实际服务不匹配所致;正确做法是使用服务名 `redis` 并指定数据库 0,而非 `localhost` 和 `-n 1`。
在您的 docker-compose.yml 中,Celery 明确配置为使用 Redis 数据库 0(通过 redis://redis:6379/0),而您执行的命令却指定了数据库 1(-n 1)并连接 localhost——这会导致 CLI 尝试访问宿主机上的 Redis 实例(若存在),而非容器内由 redis: 服务启动的实例。Docker 容器间通信必须使用服务名作为主机名,因此应将 localhost 替换为 redis。
✅ 正确的统计命令如下(在宿主机或另一容器中执行):
<code class="bash">redis-cli -h redis -p 6379 -n 0 llen celery</code>
⚠️ 注意:
-n 0显式指定数据库索引,与 Celery 配置一致;省略-n时默认为0,因此以下命令等效且更简洁:<code class="bash">redis-cli -h redis -p 6379 llen celery</code>
若使用自定义队列名(例如 CELERY_TASK_ROUTES = {'myapp.tasks.send_email': {'queue': 'email_queue'}}),则需查询对应键名:
<code class="bash">redis-cli -h redis -p 6379 llen email_queue</code>
此外,可通过 redis-cli -h redis -p 6379 keys "*" 查看当前数据库所有键,确认 Celery 队列键是否存在(默认为 celery,但也可被 CELERY_TASK_QUEUE_MAX_PRIORITY 或自定义 default_queue 改变)。
? 总结关键点:
-
主机名必须用服务名:Docker 内部网络中,
redis是可解析的服务别名,localhost指向当前容器自身; -
数据库编号必须一致:Celery 使用
/0→ CLI 必须-n 0(或省略,默认为 0); -
验证连接有效性:先执行
redis-cli -h redis ping,返回PONG表示网络与认证正常; -
避免混淆
CELERY_BROKER与CELERY_BACKEND:队列长度仅由 Broker(即 Redis List 键)决定,Backend(结果存储)不影响llen结果。
掌握这些要点后,即可精准监控 Celery 任务积压情况,为扩容、告警和性能调优提供可靠依据。


















