Memcached FAQ(1) 一般性的問題

最後更新時間 2009-04-10 更新人 [email protected]
這裏收集了經常被問到的關於memcached的問題

一般的問題

什麼是memcached?
memcached是一個高性能的、分佈式的、內存對象緩存系統。memcached本質上是一個通用的緩存系統,但是它通常被用來減小數據庫的負載,以達到加速dynamic web應用的目的。


Dange Interactive (開發memcached的組織機構,譯者注)開發memcached的目的是,加快LiveJournal.com 的速度。 LiveJournal.com 這個網站擁有大量的web server和database server,每天訪問的用戶數高達1百萬,每天的動態網頁PV高達2千萬+。有了memcached,數據庫就跟沒事一樣,其負載被大大減小。Memcached加快了動態網頁的響應時間,提高了資源利用率,加快了memcached不命中時數據庫的訪問速度。

從哪獲得memcached?
到這個下載頁面 下載吧!

怎麼安裝memcached?
可以參考安裝指南 ,也可以使用操作系統的軟件包管理系統來自動下載安裝(apt, yum等)。
如果您的linux發行版沒有memcached,或者有了memcached但版本不夠新,您還可以從源代碼安裝。從我們的下載頁面獲得源代碼的tar包,然後在shell中執行以下命令:
$ tar -zxvf memcached-1.x.x.tar.gz
$ ./configure --enable-threads (如果您想使用多線程工作方式)
$ make
$ make test
$ sudo make install
您可以使用'./configure --help' 可以查看所有的選項。

哪些平臺可以運行memcached?
任何有空閒內存的地方都可以!Memcached可以運行在linux、BSD、windows。它只需要很少的CPU時間,所以無論哪裏有空閒內存,哪裏就可以運行它。

什麼情況下適合使用memcached?
如果您的網站包含了訪問量很大的動態網頁,因而數據庫負載很高,而且大部分數據庫請求都是讀操作,那麼memcached可以幫您顯著地減小數據庫負載。


Memcached同樣適用在其他很多場合。至於到底適用哪些場合,您可以通讀Memcached FAQ和相關的指南來獲得一些靈感。如果您的數據庫負載比較低但CPU使用率很高,您可以緩存計算好的結果( computed objects )和渲染後的模板(enderred templates)。通過memcached,您可以緩存session數據、臨時數據以減少對他們的數據庫寫操作,緩存一些很小但是被頻繁訪問的文件, 緩存Web 'services'(非IBM宣揚的Web Services,譯者注)或RSS feeds的結果...

即使您的資源(CPU、內存、數據庫等,譯者注)很充足,memcached至少也可以幫您加快頁面的渲染速度。

什麼情況下不適合適用memcached?
參見這裏 。(下面也翻譯這個頁面)

Memcached的確很棒!但也不是每種場合都適用...

  • 對象的大小大於1MB
    • Memcached本身就不是爲了處理龐大的多媒體(large media)和巨大的二進制塊(streaming huge blobs)。
    • 考慮其他的條件:http://www.danga.com/mogilefs
  • key的長度大於250字符
    • 如果真的用了這麼長的key,那麼您什麼地方可能做錯了。
    • 還有,可以看看關於key長度的郵件列表。
  • 您的虛擬主機不讓您運行memcached
    • 如果您的應用託管在低端的虛擬私有服務器(virtual private server, a slice of a machine)上,像vmware, xen這類虛擬化技術並不適合運行memcached。Memcached確實需要接管和控制大塊的內存--如果memcached的內存被OS或 hypervisor交換出去,memcached的性能將大打折扣。
  • 您的應用運行在不安全的環境中
    • 記住,任何人僅僅通過telnet就可以訪問到您的memcached。如果您的應用運行在共享的系統上,要盯緊哦!
  • 您需要持久化數據,或者說您需要的應該是database
    • 如果您僅僅期待memcached提供SQL接口,那麼您可能需要重新思考一下對cache和memcached的理解。如果想對這個問題有更多的瞭解,慶參考下面dormando寫的blog。
  • links

怎麼訪問memcached?

一般來說,您的應用可以使用memcached的客戶端庫來訪問一個或多個memcached。

這個客戶端頁面上列出了所有可用的API庫,包括Perl, C, C#, PHP, Python, Java, Ruby, PostgreSQL的存儲過程及觸發器。

您可以根據memcached協議 編寫自己的客戶端庫。

怎麼把memcached當成database使用?

如果您想把memcached用作數據存儲媒介而不是緩存,那麼您應該使用database。MySQL Cluster擁有一些與memcached類似的特性(儘管MySQL Cluster安裝並不容易),而且MySQL Cluster完全可以勝任一個可靠的分佈存儲媒介。

能夠遍歷memcached中所有的item嗎?

不!Memcached不支持也不計劃支持這個操作。這個操作的速度相對緩慢且阻塞其他的操作(這裏的緩慢時相比memcached其他的命令)。如前面所說,memcached是一個緩存,不是數據庫。Tugelamemcachedb 是memcached派生出的系統,它們速度比較慢,但是行爲更有點像數據庫。

當然,memcached畢竟是軟件,所以從某種角度說,答案最終肯定是YES。但是這個操作確實慢而且阻塞memcached。對於開發和測試服務器來說,這不是問題,但是對於99.9%的真正部署來說,答案是NO。

我們前面提到的“阻塞memcached”究竟是什麼意思呢?memcached所有非調試(non-debug)命令,例如add, set, get, fulsh這些命令,無論memcached中存儲了多少數據,它們的執行都只消耗常量時間。任何遍歷所有item的命令執行所消耗的時間,將隨着memcached中數據量的增加而增加。當其他命令因爲等待(遍歷所有item的命令執行完畢)而不能得到執行,阻塞就發生了。

也許您可以說,“刪除我所有的key”這個命令平均只花費半秒鐘,我有足夠的CPU空閒時間,我隔幾秒鐘才執行一次這個命令,那麼還有什麼問題嗎(還不能遍歷所有的item嗎)?(當然有問題)因爲這半秒鐘,其他的請求都至少延遲半秒鐘。It'll take as long as it takes the hardware to process through that queue in order to catch up. So all of your other requests end up taking too long.

所以我們努力不做這樣的事情。如果您確實需要遍歷所有的item,考慮使用MySQL吧,使用主鍵訪問數據,您還可以使用一個輔助索引加快搜索速度。

發佈了3 篇原創文章 · 獲贊 1 · 訪問量 1418
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章