在memcached中可以保存的对象最大大小是多少?

36
我需要将一个相当大(11MB)的文件返回给用户。由于某些原因,我不能直接提供文件的URL(http://www.sample.com/mybigfile.exe),而必须通过代码访问。
我考虑将其保存在memcached中,以避免重复从磁盘中读取。一切似乎都很好(没有错误),但是当我尝试从memcached中检索文件时,我总是得到None,就好像文件没有缓存一样。
是否有大小限制可以被保存?
以下是代码:
def download_demo():
    """
    Returns the demo file
    """
    KEY = "xyz"
    TIME = 86400 #24 hours

    buff = memc.get(KEY)
    if not buff: 
        file = open(FILENAME, 'r')
        buff = file.read()
        memc.set(KEY, buff, TIME)

    print "Content-Type:application/x-download\nContent-Disposition:attachment;filename=%s\nContent-Length:%s\n\n%s" %    (os.path.split(FILENAME)[-1], len(buff), buff)

1
如果memcache在本地运行,那么从中读取内容可能不会带来太大的优势,因为假设有足够的RAM可用,文件系统已经将其缓存在RAM中。 - radiospiel
8个回答

43

从memcache 1.4.2开始,这是一个可由用户配置的参数:ReleaseNotes142 * memcached @ Github

可配置的最大项大小

许多人要求将memcached存储的项目大小增加到1MB以上,虽然通常建议不要这样做,但现在已经在命令行上支持。

一些明智的人也要求memcached减少最大项大小。 这也是一个选项。

新的-I参数允许您在运行时指定最大项大小。 它支持单位后缀以便自然表达项大小。

示例:

memcached -I 128k # Refuse items larger than 128k. 
memcached -I 10m  # Allow objects up to 10MB

1
就像其他答案一样,这些链接现在也已经失效了。 - e4c5

41

5
注意:现在的Memcached允许你在启动时更改大小限制。 - NoviceCoding
21
这些链接现在都已失效。 - Assaf Lavie
3
在更新版本的Memcached中,您可以使用-I选项将限制设置高达128 mb(linux.die.net/man/1/memcached)。对于大型对象存储,您可能要考虑切换到Redis。 - maxwell2022
2
哇!这个答案太老了,这些链接都已经死了两次了。 - naXa stands with Ukraine

24

总结所需步骤:

1)将Memcache更新至版本1.4.2或更高。

2)在memcache运行命令中添加标志-I 15M(或任意大小的兆字节)。

可以在命令行中或在Ubuntu中添加这一行:

-I 15M

将其复制到 /etc/memcached.conf 中的任何位置并重新启动服务。

3) 在memcache客户端中添加必要的标志。

import memcache
memc = memcache.Client(['localhost'], server_max_value_length=1024*1024*15)
memc.set(KEY, buff, TIME)
如果您没有直接访问memcache客户端的权限(即通过框架工作),那么只需直接修改memcache代码。在Ubuntu上,它是/usr/local/lib/python2.7/dist-packages/memcache.py。更改以下行:
SERVER_MAX_ITEM_LENGTH = 1024 * 1024 
to
SERVER_MAX_ITEM_LENGTH = 1024 * 1024 * 15

显然,如果您更新memcache,您需要重新执行此hack,但这是一个非常简单且快速的解决方法。


1
你想传递给Python memcache客户端的参数实际上是server_max_value_length,请参见memcache.py:163 - Zach Dwiel

2

2
这是一个失效的链接。 - maxwell2022
我在那里找不到任何新的资源。看起来广告效果不佳? - The Disintegrator
在较新版本的memcached中,您可以使用“-I”选项将限制设置为128 mb(http://linux.die.net/man/1/memcached)。我个人会转向Redis进行大型对象存储。 - maxwell2022
1
这是一个2009年的回答。在那个日期,信息是准确的,来源是官方的。现在在2014年,一些白痴们正在对所有的答案进行负面评价,因为(五年后)memcached可以存储128mb而不是1mb,开发人员没有更新官方FAQ。唯一的参考资料是一个晦涩的页面,可能会在一年内消失。好样的。现在这是我的错吗? - The Disintegrator
@TheDisintegrator请保持您的回答更新并且礼貌。专注于内容,而非个人。行为准则 - naXa stands with Ukraine

1
如果您使用Python memcached客户端,请确保在memcached服务器上增加限制的同时,也要在客户端的memcache.py文件中增加限制。

~/anaconda/lib/python2.7/site-packages/memcache.py

SERVER_MAX_KEY_LENGTH = 250 
SERVER_MAX_VALUE_LENGTH = 1024 * 1024 * 15

您可以在 memcached 控制台中查看(使用 telnet localhost 11211 命令)

stats slabs STAT 48:chunk_size 3677344


1
没有人似乎涉及到这个问题的这一部分:
相比反复从磁盘读取,我想将其保存在memcached中(如果这不是一个好主意,请告诉我)。
这不是一个好主意。所有现代文件系统都有高效的缓存机制。从磁盘读取几秒钟前读过的文件通常仍然在内存缓存中。这比通过网络访问memcached要快得多。
如果您在127.0.0.1上运行memcached,则它所声明的内存仅用于单个文件,而如果您简单地依赖操作系统的缓存,则内存可以根据手头的工作而用于各种目的。

+1. 你说的没错,Memcache在这里可能是不必要的。但我会说“这取决于情况”。我已经使用分布式缓存来加速对(文件)系统的访问。虽然它非常复杂,但根据用例(请求数量、数据大小、系统SLA、成本等),这可能是一个很好的权衡选择。 - mcoolive

1
以下文章解释了为什么将单个文件的最大大小限制为1M。

http://www.mikeperham.com/2009/06/22/slabs-pages-chunks-and-memcached/

基本上,memcache 中有小的内存页,对象驻留在内部。
默认页面大小似乎为 1M,因此一个页面可以包含的最大对象受到限制为 1M。
即使您可以配置它来增加大小,但我认为这可能会有某种性能折衷。

0

2022年更新 - 对于开源的Memcached,

  • max-item-size(-I, --max-item-size)的最小值为1KiB
  • 最大值为1 GiB
  • 默认值为1 MiB

https://github.com/memcached/memcached/blob/597645db6a2b138710f01ffe5e92e453117b987a/memcached.c#L5213

if (unit == 'k' || unit == 'K')
    size_max *= 1024;
if (unit == 'm' || unit == 'M')
    size_max *= 1024 * 1024;

https://github.com/memcached/memcached/blob/597645db6a2b138710f01ffe5e92e453117b987a/memcached.c#L5730

if (settings.item_size_max > (ITEM_SIZE_MAX_UPPER_LIMIT)) {
    fprintf(stderr, "Cannot set item size limit higher than a gigabyte.\n");
    exit(EX_USAGE);
}

对于云内存缓存变体,此值将有所不同 - 例如,这是Google Cloud Memcache的限制 - gcloud docs

注意:如果您计划增加max-item-size值,则需要检查/增加为缓存分配的内存量(maxbytes:这是整个Memcached内存)。使用-m选项指定要分配的RAM量(以兆字节为单位)。默认值为64MB。

这两个设置都可以在Memcached统计信息中检查(以字节为单位):

stats settings
STAT maxbytes 67108864
STAT item_size_max 1048576

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接