memcached中可保存对象的最大大小
我需要把一个比较大的文件(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 个回答
总结一下需要的步骤:
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,你需要再做一次这个修改,但这个修复方法非常简单快捷。
从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
在memcached 常见问题解答中,有两个相关的条目:
第一个问题的回答是(引用,强调是我自己的):
你可以在memcached中存储的值的最大大小是1兆字节。如果你的数据更大,可以考虑在客户端进行压缩,或者把这个值拆分成多个键来存储。
所以我猜你的11MB文件确实太大,无法放进一个memcached条目里。
根据其他回答,增加对象的大小是可能的。