Django缓存,缺少密钥

时间:2014-10-11 18:25:13

标签: python django caching

我正在尝试创建一个缓存流,在用户请求它缓存一个870条记录的大字典,它应该保留在缓存中一段时间​​。当定义的时间传递给下一个请求时,应该在na缓存中更新dict。

所以我创造了这样一个功能:

from django.core.cache import get_cache

def update_values_mapping():
    cache_en = get_cache('en')
    values_dict = get_values_dict() <- this make a request to obtain the dict with values
    cache_en.set_many(values_dict, 120)  # 120s for testing
    cache_en.set('expire', datetime.datetime.now() + datetime.timedelta(seconds=120))

然后在第二个函数中,我尝试从缓存中获取值

from django.core.cache import get_cache

def get_value_details(_id):
    cache = get_cache('en')
    details = cache.get(_id, {})  # Values in cache has expire date so they should eventually be gone
    expire = cache.get('expire', None)
    if not details and expire and expire < datetime.now():
        update_values_mapping()
        value = cache.get(_id, {})

    return details

在渲染视图期间,多次调用get_value_details()以获取所有需要的值。

问题是某些值缺失,例如cache.get('b',{})返回{},即使值'b'已保存到缓存(并且过期日期尚未过期)。缺失值正在改变,有时它是'a',有时'b',其他时间'c'等。

到目前为止,我一直在LocMemCache和DummyCache上测试它。 我的示例缓存设置:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'cache-default'
    },
    'en': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'cache-en'
    },
    'pl': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'cache-pl'
    }
}

当我在控制台中使用它时,一些值在下次调用update_values_mapping()后从缓存中消失,但有些值从一开始就丢失了。

有没有人知道它可能是什么? 或者也许如何以另一种方式解决所描述的流程?

1 个答案:

答案 0 :(得分:2)

LocMemCache就是这样 - 本地内存缓存。这意味着它在特定服务器进程的本地,并且在其他进程或控制台中都不可见。

如果您需要在所有进程中共享的内容,则应使用适当的缓存后端,如memcached或redis。