【问题标题】:django memcache cache miss alwaysdjango memcache 缓存总是未命中
【发布时间】:2016-06-27 01:20:36
【问题描述】:

我正在我的 Windows 系统上运行 memcached 服务,并且我已将我的开发设置配置为具有以下缓存设置:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
        'TIMEOUT': 3600,
        'OPTIONS': {
            'MAX_ENTRIES': 100
        }
    }
}

我正在使用以下代码在缓存中设置和获取内容:

from django.core.cache import cache
def get_element(fsid):
    element = cache.get(str(fsid))  # get element from memcache if present
    if element is None:
        info("cache miss for fsid-"+str(fsid))
        fs = FlowStatusModel.objects.get(pk=fsid)
        pickle_path = fs.pickle
        gcs_pickle_path = fs.gcs_pickle
        try:
            info("reading from local disk")
            with open(pickle_path, 'rb') as handle:
                element = pickle.load(handle)
        except:
            info("local disk failed. copying file from cloud storage bucket to local disk")
            create_and_copy(gcs_pickle_path, pickle_path)
            with open(gcs_pickle_path, 'rb') as handle:
                element = pickle.load(handle)
        info("adding fsid-"+str(fsid) + " to cache with 1hour timeout")
        cache.set(str(fsid), element, 3600)
    return element

我在日志中看到总是有缓存未命中。我不知道 django 是否能够在缓存中设置元素。如果我从python manage.py shell 尝试使用简单的setget,我就能取回数据。我尝试从命令提示符运行命令memcached.exe -vv 以查看它是否接收到请求,但在这两种情况下(来自 dev server/manage.py shell)我都看到任何设置或获取控制台上打印的信息。感谢您在解决问题方面的任何帮助。

【问题讨论】:

    标签: django memcached python-memcached


    【解决方案1】:

    可能是因为这个:

        'OPTIONS': {
            'MAX_ENTRIES': 100
        }
    

    这是一个非常小的数字。你可能有很多的颠簸。每次您向缓存中添加某些内容时,它很可能会替换其他内容。这可能就是您的fsid 密钥所发生的事情。

    您也有可能违反了 memcached 的最大项目大小。通过更改 memcached 配置文件 (memcached.conf) 并添加以下内容来解决此问题

    MAXITEMSIZE=12m
    

    不过需要注意的是,如果你要存储这么大的对象,memcached 可能不适合你。

    【讨论】:

    • 到目前为止,我几乎没有插入 5 个条目。你认为这仍然是一个问题吗?
    • 如何使用memcached 工具来确认这种情况?它将显示缓存实际包含多少项
    • 我做了telnet 127.0.0.1 11211,我看到当 memcached 被 django 服务器命中时STAT cmd_set 没有改变,但是当我尝试从python manage.py shell 设置时它正在增加。我认为 Django 服务器有问题。您在我当前的配置中发现任何问题吗?顺便说一句,我没有在设置文件的MIDDLEWARE_CLASSES 字段中添加任何缓存中间件类。
    • 我可以设置为值的对象的大小是否有任何限制?我试图设置为值的泡菜在磁盘上约为 10MB。
    • 看起来值的限制是 1MB。我会看看我能做些什么来改变它,或者我会看看 redis 是否符合我的需求。感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 2014-02-24
    • 2012-04-21
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多