You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django+Docker集成Redis后业务数据未存入Redis求助

Django集成Redis后业务数据未写入Redis排查解决

问题现象

已完成Redis与Django的集成并通过docker-compose部署,Redis服务运行正常。但通过docker exec -it redis redis-cli连接终端后,执行keys *仅能看到Celery相关键值,业务数据未写入Redis,尝试获取业务key(如milan、kranf)返回(nil)。

docker-compose.yml配置

version: '3.8'

services:
  web:
    build: .
    container_name: django
    ports: 
      - "8000:8000"
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    env_file:
      - .env 
    environment:
      - DEBUG=1
      - DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1
      - CELERY_BROKER=redis://redis:6379/0
      - CELERY_BACKEND=redis://redis:6379/0
      - REDIS_HOST=redis
    depends_on: 
      - db
      - redis
    links:
      - db:db

  db:
    container_name: postgres
    image: postgres
    volumes:  
      - ./data/postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=${BD_NAME}
      - POSTGRES_USER=${BD_USER}
      - POSTGRES_PASSWORD=${BD_PASSWORD}
      - POSTGRES_HOST_AUTH_METHOD=trust
    expose:
      - '5432'
 
  redis:
    image: "redis:alpine"
    restart: always
    container_name: redis
    command: redis-server
    ports:
      - 6379:6379
  
  celery:
    build: .
    command: celery -A wishes worker -l INFO
    volumes:
      - .:/app
    depends_on:
      - web
      - redis
      - db
    environment:
      - CELERY_BROKER=redis://redis:6379/0
      - CELERY_BACKEND=redis://redis:6379/0
 

volumes:
  postgres_data:

redis-cli操作示例

127.0.0.1:6379> get milan
(nil)
127.0.0.1:6379> keys *
1) "_kombu.binding.celeryev"
2) "_kombu.binding.celery"
3) "_kombu.binding.celery.pidbox"
127.0.0.1:6379> keys *
1) "_kombu.binding.celeryev"
2) "_kombu.binding.celery"
3) "_kombu.binding.celery.pidbox"
127.0.0.1:6379> get kranf
(nil)
127.0.0.1:6379> 

排查与解决步骤

1. 核对Django的Redis配置

检查项目settings.py中的Redis缓存/存储配置,确认是否指向正确的Redis实例与数据库:

# 示例缓存配置
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://redis:6379/1',  # 建议业务数据与Celery使用不同数据库,避免混淆
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    }
}
# 自定义Redis连接示例
import redis
import os
REDIS_CONN = redis.Redis(host=os.environ.get('REDIS_HOST'), port=6379, db=1)

如果业务数据配置在非db0的数据库,连接Redis-cli时需切换对应数据库查看:SELECT 1。

2. 验证Django写入逻辑

进入Django容器测试写入:

docker exec -it django python manage.py shell

在shell中执行:

from django_redis import get_redis_connection
r = get_redis_connection('default')
r.set('test_key', 'test_value')
print(r.get('test_key'))

若返回b'test_value',说明写入正常,再回到Redis-cli切换对应数据库检查数据是否存在。

3. 检查环境变量加载

确认Django容器内REDIS_HOST变量正确:

docker exec -it django env | grep REDIS_HOST

若返回异常,检查.env文件配置是否正确,或docker-compose中environment配置是否覆盖了.env内容。

4. 验证容器网络连通性

检查Django容器能否访问Redis服务:

docker exec -it django ping redis

若无法连通,确认docker-compose默认网络是否正常,若自定义网络需确保所有服务加入同一网络。

5. 查看Django日志排查错误

查看Django容器日志,定位Redis相关报错:

docker logs django

根据日志中的连接超时、认证失败等信息针对性修复。


内容的提问来源于stack exchange,提问作者KraNf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:00:19