嘗試:
啟用了PHPmemcache_set()函數中的 MEMCACHE_COMPRESSED壓縮選項,而memcache_get()可以在後續讀取過程中自動對壓縮的緩存對象進行解壓縮。
效果:
測試了一下,對於博客大巴目前的應用來說,啟用壓縮後,相同的容量(2G)存儲的對象數量增加了約一倍,緩存命中率從50%左右,提高到了60%左右。進一步提高命中率硬件投入還是必須的,又增加了2倍的內存後終於做到了緩存命中率提高到90%;
前提0: 內存緩存有用,且命中率值得提升;
從60%提高到90%,還是從90%提高到95%,要看hit後的性能能夠提升是否值得;
前提1:MemCached已經用滿
先用memcached-tool查看一下memcached的容量統計,看memcached是不是已經用滿了。如果充分運行時MemCached的空間尚未用滿,啟用一下壓縮是沒有意義的; 而且:發現沒有用滿的MemCached,最好減少相應MemCached的容量,空余出更多內存給其他服務做緩存;
前提2:壓縮率
緩存的數據的確有大於幾百字節的,如果都是小於100字節的鍵值對,壓縮可能反而帶來膨脹。由於緩存對象的大小在Memcached中都是按照固定大小分塊存儲的,最小也要88 B。所以對於過小數據帶來的壓縮膨脹並不是太大的問題;
前台應用的CPU損耗:
對數據的額外壓縮CPU損耗遠遠低於緩存命中率提升減少後台數據庫訪問帶來的性能提升,和http的gzip/deflate壓縮類似,壓縮後數據一般為原數據大小的30%左右,節省了70%的傳輸性能消耗所得會大於文件壓縮帶來的性能損耗;