【问题标题】:Why django redis cache cannot get the data in redis为什么django redis缓存无法获取redis中的数据
【发布时间】:2019-03-27 15:58:54
【问题描述】:

我的缓存设置:

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获取数据,该怎么办?

【问题讨论】:

    标签: django redis django-redis


    【解决方案1】:

    Django 缓存为缓存键添加了前缀。默认情况下,这取决于您的CACHES 设置中的KEY_PREFIX 和VERSION。您还可以使用自定义 KEY_FUNCTION 自定义行为。

    您可以使用make_key 方法找出完整的缓存键:

    >>> from django.core.cache import cache
    >>> cache.make_key('somekey')
    ':1:somekey'
    

    您可以在拨打redis_conn.set() 时使用此完整密钥。

    正如您在 cmets 中指出的,还有第二个困难。 Django-redis serializes the cache values。默认情况下,它使用 Python pickle,但也有可用的 JSON 序列化程序,或者您可以选择自己的。

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

    【讨论】:

    • 谢谢,它有很大帮助。当我设置一个 int 值时,它可以工作。但是当我的值的类型是字符串或字典时,我必须对我的值进行编码,否则程序可能会引发异常。
    • 这是一个很好的观点。我已经用关于序列化程序的注释更新了答案。
    猜你喜欢
    • 2017-07-27
    • 1970-01-01
    • 2017-08-31
    • 2021-07-02
    • 2021-04-12
    • 2014-08-05
    • 2017-01-24
    • 2023-03-28
    • 2018-04-03
    相关资源
    最近更新 更多