關於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