我有一个 302MB 的对象(实际上是一个对象数组)。当我尝试使用 memcached 缓存它时,无论我给 memcached 多少内存,它都不起作用,显然是因为 memcached 对它可以缓存的对象有 1MB 的限制。 (我对最后一部分可能是错的。我找不到很好的文档。)
关于如何缓存这个东西有什么建议吗?我在 Linux 上使用 PHP/symfony。
Quoting
15.5.5.4:可以在内存缓存中存储的对象的最大大小是多少?是否可以配置?
默认最大对象大小为 1MB。在 memcached 1.4.2 及更高版本中,您可以使用 -I 命令行选项更改对象的最大大小。
对于在此之前的版本,要增加此大小,您必须重新编译 memcached。您可以修改源代码内的slabs.c 文件中POWER_BLOCK 的值。
在 memcached 1.4.2 及更高版本中,您可以使用 -I 命令行选项配置支持的最大对象大小。例如,要将最大对象大小增加到 5MB:
$ memcached -I 5m
然而,即使增加内存,这也不是一个好的选择。更好的想法是将对象分成更小的部分,然后缓存它的各个部分。
Quoting 为什么项目的大小限制为 1 MB?
简短的回答:因为内存分配器的算法是如何工作的。
长答案:Memcached 的内存存储引擎(将来将是可插拔/调整的......),使用平板方法进行内存管理。内存被分成不同大小的板块,从最小数量开始,按阶乘递增到最大可能值。
假设最小值为 400 字节,最大值为 1 兆字节,阶乘为 1.20:
板 1 - 400 字节 板 2 - 480 字节 板 3 - 576 字节 ... 等等。
板越大,它与前一块板之间的间隙就越大。因此最大值越大,内存存储的效率越低。 Memcached 还必须为每个存在的slab 预先分配一些内存,因此设置较小的阶乘和较大的最大值将需要更多的开销。
您不想这样做还有其他原因......如果我们正在谈论一个网页并且您尝试存储/加载那么大的值,那么您可能做错了什么。在该大小下,将数据结构加载和解压到内存中将花费大量时间,并且您的站点可能不会很好地运行。
如果您确实想要存储大于 1MB 的项目,您可以使用编辑过的slabs.c:POWER_BLOCK 值重新编译memcached,或者使用低效的malloc/free 后端。其他建议包括数据库、MogileFS 等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)