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

django-redis与redis Python库读取Redis缓存结果不一致求助

问题分析

你遇到的问题根源是django-redis默认会对缓存键进行自动前缀处理,而原生redis-py库直接使用你传入的原始键名访问Redis,两者的键名不匹配,所以django-redis返回None。

举个例子:当你用原生redis设置my_key时,Redis里实际存储的键就是my_key;但django-redis的get方法会自动给键加上前缀(默认格式类似:1:my_key,其中1是数据库编号),它实际在找的是带前缀的键,自然找不到你用原生库设置的my_key。

解决方案

方案1:让django-redis使用原始键名(关闭前缀)

如果你不需要前缀隔离,可以在初始化RedisCache时关闭前缀功能,添加KEY_PREFIX参数设为空字符串:

from django_redis.cache import RedisCache

django_redis = RedisCache(
    server='redis://localhost:6379/1',
    params={
        'OPTIONS': {'CLIENT_CLASS': 'django_redis.client.DefaultClient'},
        'KEY_PREFIX': ''  # 关闭键前缀
    }
)
print(django_redis.get('my_key'))  # 现在能拿到'my_value'

方案2:用原生redis库时添加django-redis的前缀

如果你需要保留前缀,那用原生库访问时要手动加上django-redis的默认前缀。默认前缀格式是:{数据库编号}:{原始键名},比如你用的是数据库1,那键就是:1:my_key:

import redis
from redis.connection import HiredisParser, ConnectionPool

connection_pool = ConnectionPool.from_url(url='redis://localhost:6379/1', parser_class=HiredisParser)
redis_client = redis.Redis(connection_pool=connection_pool)

# 手动添加前缀
redis_value = redis_client.get(':1:my_key')
print(redis_value)  # b'my_value'

方案3:用django-redis的底层原生客户端操作

django-redis提供了直接访问底层redis-py客户端的方法,绕开缓存的前缀处理,这样就能和原生库共用键名:

from django_redis.cache import RedisCache

django_redis = RedisCache(
    server='redis://localhost:6379/1',
    params={'OPTIONS': {'CLIENT_CLASS': 'django_redis.client.DefaultClient'}}
)
# 获取底层原生客户端
native_client = django_redis.client.get_client()
print(native_client.get('my_key'))  # b'my_value'
额外说明

django-redis加前缀是为了在同一个Redis实例中隔离不同的缓存空间(比如不同Django项目或不同环境),如果你的Lambda服务和Django服务共用Redis,建议统一使用相同的前缀规则,或者都关闭前缀,避免键名冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:20:02