cfi*_*her 27 python memcached limit
我需要向用户返回一个相当大的文件(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)
Run Code Online (Sandbox Code Playgroud)
nsa*_*ers 35
从memcache 1.4.2开始,这是一个用户可配置的参数:ReleaseNotes142*memcached @ Github
可配置的最大项目大小
许多人要求memcached能够存储大于1MB的项目,而通常建议不要这样做,现在命令行支持它.
一些开明的人也要求memcached减少最大项目大小.这也是一种选择.
新的-I参数允许您在运行时指定最大项目大小.它支持单位后缀,以允许项目大小的自然表达.
例子:
Run Code Online (Sandbox Code Playgroud)memcached -I 128k # Refuse items larger than 128k. memcached -I 10m # Allow objects up to 10MB
Pas*_*TIN 33
在memcached FAQ中有两个条目:
第一个答案是(引用,强调我的):
您可以在memcached中存储的值的最大大小为1兆字节.如果您的数据较大,请考虑客户端压缩或将值拆分为多个键.
所以我猜你的11MB文件太大了,无法放入一个memcached条目中.
根据其他答案,可以增加对象的大小.
Ale*_*lex 22
总结必要的步骤:
1)将Memcache更新到1.4.2或更高版本.
2)将标志-I 15M(或多兆字节)添加到memcache run命令.
这是命令行,或者在Ubuntu中添加行
-I 15M
Run Code Online (Sandbox Code Playgroud)
到/etc/memcached.conf中的任何位置并重新启动该服务.
3)在memcache中向客户端添加必要的标志.
import memcache
memc = memcache.Client(['localhost'], server_max_value_length=1024*1024*15)
memc.set(KEY, buff, TIME)
Run Code Online (Sandbox Code Playgroud)
如果您没有直接访问memcache客户端(即通过框架工作),那么只需直接破解内存缓存代码即可.
在Ubuntu上,它是/usr/local/lib/python2.7/dist-packages/memcache.py.换行:
SERVER_MAX_ITEM_LENGTH = 1024 * 1024
Run Code Online (Sandbox Code Playgroud)
至
SERVER_MAX_ITEM_LENGTH = 1024 * 1024 * 15
Run Code Online (Sandbox Code Playgroud)
显然,如果你更新内存缓存,你需要再次进行这种黑客攻击,但这是一个非常简单快速的修复.