首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django Cache:使用Memcached并回退到FileSystem

Django Cache:使用Memcached并回退到FileSystem
EN

Stack Overflow用户
提问于 2013-03-17 03:28:57
回答 2查看 1.3K关注 0票数 3

简单的问题:

我的服务器有1G内存和10 My磁盘空间

我正在使用per-site cache,我想尽可能多地使用Memcached,但当它空间不足时,cache will be saved in hard disk

(所有站点的页面加起来约为2 2GB)

有没有简单的配置来实现这一点?

这是一件明智的事情吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-20 05:35:12

这听起来像是您希望Memcached的行为像正常的RAM和页面到磁盘时,它是满的。它不是默认的,但你可以通过编写自己的缓存后端来模仿它,就像@AlexanderAfanasiev提到的那样。实现应该是这样的:

首先,定义三个缓存:

代码语言:javascript
运行
复制
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中:

代码语言:javascript
运行
复制
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()等。希望这能让您走上正确的道路。

票数 7
EN

Stack Overflow用户

发布于 2014-12-05 00:00:20

利用TCP/IP。

代码语言:javascript
运行
复制
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',
        }
    }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15453716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档