简单的问题:
我的服务器有 1G RAM 和 10GB 磁盘空间
我正在使用每站点缓存,并且我想尽可能多地使用Memcached,但是当它的空间不足时,缓存将保存在硬盘中。
(所有网站的页面加起来大约 2GB)
是否有一个简单的配置来实现这一点?
这是一件很聪明的事情吗?
谢谢
听起来您希望 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 可以管理自己的滚降,只有最旧的命中必须回退到 file_cache。这就是你想要的。
当然,您还必须实现其余的缓存函数,如delete()
、get_many()
等。希望这能让您走上正确的道路。
利用 TCP/IP。只需稍加努力,就可以扩展此逻辑以创建具有回退功能的良好多缓存后端。
import socket
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
socket.connect(('127.0.0.1', 11211))
socket.close()
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
except:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/srv/django_cache',
}
}