2016-03-24 40 views
2

我成立了,我用这样一个简单的本地内存缓存:缓存随机删除项目

from django.core.cache import caches 

def stats_service(db): 
    stats_cache = caches['stats'] 
    if stats_cache.get(db) is None: 
     stats_cache.set(db, GlobalStatsService(db)) 
    return stats_cache.get(db) 

在服务器运行后,我调用该函数通过视图,在命令行卷曲,初始化缓存。

的问题是,如果我叫了好几次,有时它会找到该项目,并立即返回值,符合市场预期,有时候会找不到它,将重新计算值。密钥(这里是db)是我期望它们的字符串。我无法理解为什么项目从缓存中删除,显然是随机的,以及如何让它们保留。

有趣的是,该行为是一样的,我使用全局变量,而不是Django的缓存框架时(我尝试所有这些,除了memcached的,因为1MB限制)。

我已没有TIMEOUT值(和明显的全局变量版本要么什么都没有):

CACHES = { 
    ... 
    'stats': { 
     'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 
     'LOCATION': 'stats', 
    }, 

我的应用程序与Apache和mod_wsgi的,2个进程和4个线程运行。也许它是相关的。难道是不同的进程访问它自己的缓存版本?

我在做什么错?

回答

3

是的,这正是发生了什么。本地内存缓存恰好是:本地进程。

它不适合用于生产,绝对不适用于多进程环境。使用适当的缓存后端;例如,Redis启动和运行起来非常简单。

+0

这Redis的样子我需要什么,谢谢。像Memcached一样,但没有内存限制。奇怪的是,Django文档甚至没有提到它。 – JulienD

+0

@muraveill Redis不是内置的,它需要第三方后端。这就是为什么它没有在文档中提到。 – knbk

+0

@knbk因此,没有了Memcached,但它提到:https://docs.djangoproject.com/en/1.9/topics/cache/#memcached。 – JulienD