【问题标题】:Django Redis cache valuesDjango Redis 缓存值
【发布时间】:2017-01-24 06:42:18
【问题描述】:

我已使用 python 脚本在外部将值设置为 Redis 服务器。

r = redis.StrictRedis(host='localhost', port=6379, db=1)
r.set('foo', 'bar')

并尝试使用views.py 中的django 缓存从Web 请求中获取值。

from django.core.cache import cache
val = cache.get("foo")

它返回无。但是当我试图得到它的形式时

from django_redis import get_redis_connection
con = get_redis_connection("default")
val = con.get("foo")

它返回正确的值'bar'。缓存和直接连接是如何工作的?

【问题讨论】:

    标签: django redis django-cache


    【解决方案1】:

    库通常使用几个内部前缀来存储 redis 中的键,以免与用户定义的键相混淆。

    例如,django-redis-cache 会在您保存到其中的每个密钥前添加一个“:1:”。

    例如,当您执行r.set('foo', 'bar') 时,它会将密钥设置为“:1:foo”。由于您不知道密钥前面的前缀,因此您无法使用普通 get 获取密钥,您必须使用它自己的 API 来获取。

    r.set('foo', 'bar')
    
    r.get('foo') # None
    r.get(':1:foo') # bar
    

    所以最后,它会返回你使用的库,去阅读它的代码,看看它是如何准确地保存密钥的。 redis-cli 在这里可以成为您的宝贵朋友。基本上用cache.set('foo', 'bar') 设置一个键,然后进入redis-cli 并使用'keys *' 命令查看为foo 设置的键。

    【讨论】:

    • 谢谢。存储在 redis 中的密钥是 'foo'。当我设置使用 django 缓存时,就像你说的那样存储。 ":1:foo" 但是当我从 cache.get('') 获取它时,即使正确的密钥在数据库中,它也会返回 null。
    • @KareshArunakirinathan 你的意思是使用 cache.get("foo") 返回 None ?
    • 在 django-redis-client 的具体情况下,前缀用于版本控制:Add delta to value in the cache. Source - github.com/sebleier/django-redis-cache/blob/…。测试 - github.com/sebleier/django-redis-cache/blob/….
    猜你喜欢
    • 2014-08-05
    • 2020-01-27
    • 2021-04-02
    • 2015-05-29
    • 2022-11-25
    • 2014-03-22
    • 2016-06-14
    • 2021-08-29
    • 2021-08-19
    相关资源
    最近更新 更多