memcached中可保存对象的最大大小

36 投票
8 回答
73498 浏览
提问于 2025-04-15 14:23

我需要把一个比较大的文件(11MB)返回给用户。由于某些原因,我不能直接提供这个文件的链接(比如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)

8 个回答

24

总结一下需要的步骤:

1) 把Memcache更新到1.4.2版本或更高的版本。

2) 在运行memcache的命令中加上标志 -I 15M(或者你需要的其他大小,单位是兆字节)。

这可以在命令行中直接输入,或者在Ubuntu系统中,你可以在

-I 15M

这个文件的任何地方添加这一行,然后重启服务。

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 

改成

SERVER_MAX_ITEM_LENGTH = 1024 * 1024 * 15

显然,如果你更新了memcache,你需要再做一次这个修改,但这个修复方法非常简单快捷。

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
41

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

第一个问题的回答是(引用,强调是我自己的)

你可以在memcached中存储的值的最大大小是1兆字节。如果你的数据更大,可以考虑在客户端进行压缩,或者把这个值拆分成多个键来存储。

所以我猜你的11MB文件确实太大,无法放进一个memcached条目里。

根据其他回答,增加对象的大小是可能的。

撰写回答