2016-03-24 76 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