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

關於memcached的value最大是1M的限制不少人都知道,可是若是你覺得我還要說這個事情,那你就錯了。php

以前的老版本確實是只能是1M,可是根據git記錄,其實2009年之後的版本這個value最大值已是可配置的了,可是目前互聯網上大多數資料,調整value最大值的方法仍是去改源碼。git

首先看下memcached的啓動參數架構

memcached --help | grep max-item-size

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

在跟蹤的源碼(略去了無關配置項),memcached.cmemcached

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。code

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

更多架構、PHP、GO相關踩坑實踐技巧請關注個人公衆號:PHP架構師get

相關文章
相關標籤/搜索