3

簡単な質問:

私のサーバーには1GのRAMと10GBのディスクスペースがあります

サイトごとのキャッシュを使用しており、可能な限りMemcachedを使用したいのですが、スペースが不足すると、キャッシュがハードディスクに保存されます。

(すべてのサイトのページを合わせて約2GBです)

これを実現するための簡単な構成はありますか?

賢いことですか?

ありがとう

4

2 に答える 2

7

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()うまくいけば、これで正しい道に進むことができます。

于 2013-03-19T21:35:12.047 に答える
-1

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',
        }
    }
于 2014-12-04T16:00:19.603 に答える