簡単な質問:
私のサーバーには1GのRAMと10GBのディスクスペースがあります
サイトごとのキャッシュを使用しており、可能な限りMemcachedを使用したいのですが、スペースが不足すると、キャッシュがハードディスクに保存されます。
(すべてのサイトのページを合わせて約2GBです)
これを実現するための簡単な構成はありますか?
賢いことですか?
ありがとう
簡単な質問:
私のサーバーには1GのRAMと10GBのディスクスペースがあります
サイトごとのキャッシュを使用しており、可能な限りMemcachedを使用したいのですが、スペースが不足すると、キャッシュがハードディスクに保存されます。
(すべてのサイトのページを合わせて約2GBです)
これを実現するための簡単な構成はありますか?
賢いことですか?
ありがとう
Memcached が通常の RAM のように動作し、いっぱいになったときにページからディスクへのページを作成したいようです。デフォルトではありませんが、@AlexanderAfanasiev が述べたように、独自のキャッシュ バックエンドを作成することで模倣できます。実装は次のようなものになります。
まず、3 つのキャッシュを定義します。
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',
}
}