memcached value最大限制只能是1M吗

关于memcached的value最大是1M的限制很多人都知道,但是如果你以为我还要说这个事情,那你就错了。

之前的老版本确实是只能是1M,但是根据git记录,其实2009年以后的版本这个value最大值已经是可配置的了,但是目前互联网上大多数资料,调整value最大值的方法还是去改源码。

首先看下memcached的启动参数


memcached --help | grep max-item-size

-I, --max-item-size=<num> adjusts max item size

在跟踪的源码(略去了无关配置项),memcached.c


static void settings_init(void) {
    ……
    settings.item_size_max = 1024 * 1024; /* The famous 1MB upper limit. */
    ……
}

测试下


memcached --max-item-size=3145728 // 3M

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'));

最后,虽然这个参数是可调整,但是还是建议用默认值,如果真的超过出现了超过1M的value,首先试试压缩(php memcached 扩展,在value超过2000的时候,默认使用fastlz压缩),如果还是大于1M,就把value分割,然后读的时候使用批量获取,比如php使用getMulti。



$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);
?>

更多架构、PHP、GO相关踩坑实践技巧请关注我的公众号:PHP架构师

PHP架构师

你可能感兴趣的:(memcached value最大限制只能是1M吗)