为什么Django Redis缓存无法获取Redis中的数据?

3

我的缓存设置:

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        },
    }
}

主机地址是127.0.0.1,端口号是6379,数据库编号为1。

我想要使用redis_connection添加数据,如下所示:

from django_redis import get_redis_connection

redis_conn = get_redis_connection('default')
redis_conn.set('somekey', 'somevalue')

现在Redis数据库里已经有了数据,我可以通过以下方式获取它:

redis_conn.get('somekey')

但是我无法通过django.core.cache.cache获取它,尽管数据存在于数据库中:

from django.core.cache import cache
cache.get('somekey')  #return None

如果我必须使用conn来设置数据并使用cache来获取数据,我该怎么做?
1个回答

4
Django缓存会为缓存键添加前缀。默认情况下,这取决于您在CACHES设置中的KEY_PREFIXVERSION。您还可以使用自定义KEY_FUNCTION来自定义行为。
您可以使用make_key方法找到完整的缓存键:
>>> from django.core.cache import cache
>>> cache.make_key('somekey')
':1:somekey'

当您调用redis_conn.set()时,可以使用此完整密钥。

正如您在评论中指出的那样,第二个困难是Django-redis 序列化缓存值。默认情况下,它使用Python pickle,但也有一个可用的JSON序列化程序,或者您可以选择自己的序列化程序。

使用redis_conn.set()写入缓存时,您必须以相同的方式对数据进行序列化,以便django-redis可以读取它。


1
谢谢,这很有帮助。当我设置一个整数值时,它可以正常工作。但是当我的值的类型为字符串或字典时,我必须对其进行编码,否则程序可能会引发异常。 - QiuYu
这是一个很好的观点。我已经更新了答案,并加上了有关序列化程序的注释。 - Alasdair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接