使用memcache.py可以在memcached中保存的最大对象大小

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参数允许您在运行时指定最大项目大小.它支持单位后缀,以允许项目大小的自然表达.

例子:

memcached -I 128k # Refuse items larger than 128k. 
memcached -I 10m  # Allow objects up to 10MB
Run Code Online (Sandbox Code Playgroud)


Pas*_*TIN 33

memcached FAQ中有两个条目:

第一个答案是(引用,强调我的):

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

所以我猜你的11MB文件太大了,无法放入一个memcached条目中.

根据其他答案,可以增加对象的大小.

  • 这些链接现在全都死了 (20认同)
  • 注意:Memcached现在允许您在启动时更改大小限制 (5认同)
  • 在较新版本的Memcached中,您可以使用-I选项(linux.die.net/man/1/memcached)将限制设置为128 MB.您可以考虑切换到Redis以进行大对象存储. (3认同)
  • 哇!答案太旧了,以至于这些链接失效了两次。 (2认同)

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)

显然,如果你更新内存缓存,你需要再次进行这种黑客攻击,但这是一个非常简单快速的修复.