关于memcached的value最大是1M的限制很多人都知道,但是如果你以为我还要说这个事情,那你就错了。
之前的老版本确实是只能是1M,但是根据git记录,其实2009年以后的版本这个value最大值已经是可配置的了,但是目前互联网上大多数资料,调整value最大值的方法还是去改源码。
首先看下memcached的启动参数
memcached --help | grep max-item-size
-I, --max-item-size=<num> adjusts max item size
1
2
3
4
5
在跟踪的源码(略去了无关配置项),memcached.c
static void settings_init(void) {
……
settings.item_size_max = 1024 * 1024; /* The famous 1MB upper limit. */
……
}
1
2
3
4
5
6
7
测试下
memcached --max-item-size=3145728 // 3M
1
2
3
ini_set('memcached.compression_threshold', 1024 * 1024 * 3); // 调高 php memcached扩展压缩阀值
$m = new Memcached();
$m->addServer('127.0.0.1', 11211);
$str = '';
$len = 1024 * 1024 * 2;
for ($i = 0; $i < $len; $i++) {
$str .= 'v';
}
$m->set('k', $str);
echo strlen($m->get('k'));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
最后,虽然这个参数是可调整,但是还是建议用默认值,如果真的超过出现了超过1M的value,首先试试压缩(php memcached 扩展,在value超过2000的时候,默认使用fastlz压缩),如果还是大于1M,就把value分割,然后读的时候使用批量获取,比如php使用getMulti。
<?php
$m = new Memcached();
$m->addServer('localhost', 11211);
$items = array(
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
);
$m->setMulti($items);
$result = $m->getMulti(array('key1', 'key3', 'badkey'), $cas);
var_dump($result, $cas);
?>
---------------------
作者:安木1991
来源:CSDN
原文:https://blog.csdn.net/weixin_42900065/article/details/81513199?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!