Это звучит, как вы хотите Memcached вести себя как нормальный RAM и страницы на диск, когда она полна. Он не по умолчанию, но вы можете имитировать его, написав свой собственный кеш-сервер, как упоминал @AlexanderAfanasiev. Реализация будет что-то вдоль этих линий:
Во-первых, определить три кэши:
CACHES = {
'default': {
'BACKEND': 'myapp.cache.DoubleCache',
},
'memcached': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
},
'filecache': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/foo/bar',
}
}
Затем в MYAPP/cache.py:
from django.core.cache.backends.base import BaseCache
from django.core.cache import get_cache, cache
mem_cache = get_cache('memcached')
file_cache = get_cache('filecache')
class DoubleCache(BaseCache):
def get(self, key, default=None, version=None):
result = mem_cache.get(key, default=default, version=version)
if result:
return result
else:
return file_cache.get(key, default=default, version=version)
def set(self, key, value, timeout=None, version=None, client=None, _add_only=False):
memcache_result = mem_cache.set(key, value, timeout=timeout, version=version, client=client, _add_only=_add_only)
file_result = file_cache.set(key, value, timeout=timeout, version=version, client=client, _add_only=_add_only)
return memcache_result
Это будет всегда ценности хранить в обоих кэшей , Он будет извлекать значения из Memcached, и если он промахивается, попробует file_cache. Это означает, что Memcached может управлять своим собственным откатом, и только самые старые удары должны будут вернуться к файловому_качу. Это то, что вы хотите.
Конечно, вам также придется реализовать остальные функции кеша, такие как delete()
, get_many()
и т. Д. Надеемся, это поможет вам на правильном пути.
Один из способов (не уверен, что самый простой), чтобы написать [пользовательский бэкенд] (https://docs.djangoproject.com/en/dev/topics/cache/#using-a-custom-cache- backend) и переключиться на кеш файловой системы, если memcached не может хранить вещи больше. Взгляните на django [встроенные бэкэнды] (https://github.com/django/django/tree/master/django/core/cache/backends). – alecxe
@AlexanderAfanasiev Я знаю, что это направление, мой вопрос о лучшей практике для его реализации. – YardenST