如何告诉 Django,memcached 运行时的项目大小大于默认值?

问题描述 投票:0回答:3

我正在使用新设置来增加 memcached 中的项目大小,但我无法通过 Django 后端存储大于 1mb 的内容。 我知道

memcache
模块需要一些设置才能实现这一点,并且 Django 在后端使用这个模块。

python django caching memcached
3个回答
7
投票

来自 memcache.py 可以保存在 memcached 中的对象的最大大小:

memcached 常见问题解答中有两个相关条目:

  • 您可以存储的最大数据大小是多少?为什么物品仅限于 1兆字节大小?第一个的答案是(引用,强调 我的):

  • 您可以在 memcached 中存储的值的最大大小为 1 MB。 如果您的数据较大,请考虑客户端压缩或拆分 将值分成多个键。

所以我猜你的 11MB 文件太大了,无法容纳在一个文件中 内存缓存条目。

如果你确实想缓存更大的对象,你将不得不继承 Django 的 MemcachedCache 的子类,因为它不允许你传入选项

self._client = self._lib.Client(self._servers, pickleProtocol=pickle.HIGHEST_PROTOCOL)

子类实现示例:

from django.core.cache.backends.memcached import MemcachedCache

class LargeMemcachedCache(MemcachedCache):
    "Memcached cache for large objects"

    @property
    def _cache(self):
        if getattr(self, '_client', None) is None:
            self._client = self._lib.Client(self._servers, 
                           pickleProtocol=pickle.HIGHEST_PROTOCOL, 
                           server_max_value_length = 1024*1024*10)
        return self._client

3
投票

在较新的 Django 版本中,您不需要子类化缓存类,您可以在

OPTIONS
中指定传递给缓存类构造函数的参数:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
        'KEY_FUNCTION': 'some.path.to.a.function',
        'OPTIONS': {
            'server_max_value_length': 1024 * 1024 * 10
        }
    }
}

请参阅文档

请注意,您还必须通过添加以下行来增加 memcached 本身的大小:

-I 10m

/etc/memcached.conf
并重新启动它:

sudo service memcached restart

0
投票

Django 在 4.1 之后弃用了 Memcached

您可以使用 PyMemcacheCache 代替 MemcachedCache 所以 BACKEND 变成了

"BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache",

和之前一样,memcache默认的object_size_limit是1mb,但是不再使用'serve_max_value_length'。 PyMemcacheCache 将使用您在 memcachce 配置中手动设置的任何大小限制 就我而言,在 Debian 上运行时,我必须将以下行添加到 /etc/memcached.conf

-I 10m

这使得大小限制为 10 mb

© www.soinside.com 2019 - 2024. All rights reserved.