2014-10-11 106 views
0

我想做一个缓存流,在用户请求缓存一个870记录的大字典,它应该留在缓存一段时间。当定义的时间在下一次请求时传递时,字典应该在na缓存中更新。Django缓存,丢失密钥

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

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()的下一次调用后消失,但有些人从一开始就下落不明。

有没有人有任何线索可能是什么? 或者,也许如何解决另一种方式描述的流程?

回答

0

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

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