2016-03-24 13 views
2

ich einen einfachen lokalen Cache-Speicher, die ich wie folgt verwenden:Cache zufällig Entfernen von Elementen

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) 

Nachdem der Server ausgeführt wird, nenne ich diese Funktion durch eine Ansicht, mit einer Locke auf der Kommandozeile , um den Cache zu initialisieren.

Das Problem ist, dass, wenn ich es mehrmals anrufe, wird es manchmal das Element finden und den Wert sofort zurückgeben, wie erwartet, und manchmal wird es nicht finden und wird den Wert neu berechnen. Die Schlüssel (hier db) sind die Zeichenfolgen, die ich von ihnen erwarte. Ich kann nicht verstehen, warum Gegenstände zufällig aus dem Cache fallen und wie sie bleiben.

Interessanterweise war das Verhalten das gleiche, wenn ich globale Variablen anstelle von Djangos Cachegramework verwendete (und ich probierte sie alle außer memcached wegen der Begrenzung 1MB).

Ich habe gesetzt keinen TIMEOUT Wert (und natürlich die globale Variablen Version hatte keine entweder):

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

Meine App läuft mit Apache und mod_wsgi, 2 Prozessen und 4 Threads. Vielleicht ist es verwandt. Kann es sein, dass ein anderer Prozess auf seine eigene Cache-Version zugreift?

Was mache ich falsch?

Antwort

3

Ja, genau das passiert gerade. Der lokale Speicher-Cache ist genau das: lokal für den Prozess.

Es ist nicht wirklich geeignet für den Einsatz in der Produktion, und definitiv nicht in einer Multi-Prozess-Umgebung. Verwenden Sie ein ordnungsgemäßes Cache-Back-End; Redis zum Beispiel ist sehr einfach zum Laufen zu bringen.

+0

Diese Redis sieht aus wie ich brauche, danke. Wie Memcached, aber ohne Speicherbegrenzung. Seltsam, dass Django-Doktoren es nicht einmal erwähnen. – JulienD

+0

@muraveill Redis ist nicht integriert, erfordert ein Back-End von Drittanbietern. Deshalb wird es in den Dokumenten nicht erwähnt. – knbk

+0

@knbk So tut Memcached, aber es wird erwähnt: https://docs.djangoproject.com/en/1.9/topics/cache/#memcached. – JulienD

Verwandte Themen