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?
Diese Redis sieht aus wie ich brauche, danke. Wie Memcached, aber ohne Speicherbegrenzung. Seltsam, dass Django-Doktoren es nicht einmal erwähnen. – JulienD
@muraveill Redis ist nicht integriert, erfordert ein Back-End von Drittanbietern. Deshalb wird es in den Dokumenten nicht erwähnt. – knbk
@knbk So tut Memcached, aber es wird erwähnt: https://docs.djangoproject.com/en/1.9/topics/cache/#memcached. – JulienD