memcached save 資料的一些疑問

來源:互聯網
上載者:User
眾所周知,memcached儲存的時候可以這樣寫:

$memcached->save("a", array("abc","bacd"), MEMCACHE_COMPRESSED, 0);

以及:

$memcached->save("a", json_encode(array("abc","bacd")), MEMCACHE_COMPRESSED, 0);

但,問題就來了,經過1W調資料測試,若 $data =array();中包含中文漢字 通過 json_encode 存入memcached後,明顯要比直接存入array的速度要慢很多很多。

可是memcache的底層save的時候,如果傳遞的$value為array()那麼採用serialize進行序列化。

可是,jsonencode和serialize的效能差異非常大,jsonencode明顯會要比serialize要快許多。

求問,memcached最終傳遞什麼值為好?array?還是string?

回複內容:

眾所周知,memcached儲存的時候可以這樣寫:

$memcached->save("a", array("abc","bacd"), MEMCACHE_COMPRESSED, 0);

以及:

$memcached->save("a", json_encode(array("abc","bacd")), MEMCACHE_COMPRESSED, 0);

但,問題就來了,經過1W調資料測試,若 $data =array();中包含中文漢字 通過 json_encode 存入memcached後,明顯要比直接存入array的速度要慢很多很多。

可是memcache的底層save的時候,如果傳遞的$value為array()那麼採用serialize進行序列化。

可是,jsonencode和serialize的效能差異非常大,jsonencode明顯會要比serialize要快許多。

求問,memcached最終傳遞什麼值為好?array?還是string?

json_encode明顯要比serialize快很多?R U SURE?

 0; $i--) serialize($str);printf("serialize: in %f seconds\n", microtime_float() - $time_start);$time_start = microtime_float();for ($i = 2000000; $i > 0; $i--) json_encode($str);printf("json_encode: in %f seconds\n", microtime_float() - $time_start);

Run:
serialize: in 0.928114 seconds
json_encode: in 4.315019 seconds

發現了上面的結論,下面可以直接被忽略了,僅供參考。

@iCode的說法可能是一部分的原因;更重要的是,無論是serialize還是json_encode,肯定都是O(n)的,只是serialize的常數可能比json_encode大;然而,由於serialize是在memcache內部調用的,是直接了當地轉換,存到sendbuf裡,所以可以省掉相當的轉換開銷:

//memcache_binary_protocol.c +416status = mmc_pack_value(pool, &(request->sendbuf), value, &flags TSRMLS_CC);=> default:     php_var_serialize(&(buffer->value), &value_copy_ptr, &value_hash TSRMLS_CC);     ...;     mmc_compress(pool, buffer, buffer->value.c + prev_len, buffer->value.len - prev_len, flags, 1 TSRMLS_CC);

而json_encode則不然:必須先分配一塊空間,存進去,產生一個對應的zval對象,扔回php,再由php交給memcache,然後:

//memcache_binary_protocol.c +416status = mmc_pack_value(pool, &(request->sendbuf), value, &flags TSRMLS_CC);=> case IS_STRING:     *flags |= MMC_TYPE_STRING;     mmc_compress(pool, buffer, Z_STRVAL_P(value), Z_STRLEN_P(value), flags, 0 TSRMLS_CC);

可以想象,在這樣一個過程中,使用json_encode的開銷顯著增加了。所以它比直接serialize更差是可以理解的。

至於到底該用哪個,說真的,php本來效能就差得很,不用特別在意這個地方,它往往不太可能會是效能的瓶頸。如果真的覺得到了效能最佳化要摳這裡的時候(估計你更可能會選擇用其他語言重寫,例如python)(或者恭喜你,可以去找投資人了),方法很多,再不濟至少你可以直接修改memcache的源碼,把php_var_serialize改成json_encode。

越長存起來就越慢的道理你是懂的吧 ..?

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.