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
相关产品推荐
相关产品推荐

