天天看點

Memcached FAQ(1) 一般性的問題

最後更新時間 2009-04-10    更新人 [email protected]

這裡收集了經常被問到的關于memcached的問題

  •  一般的問題
    • 什麼是memcached?
    • 從哪獲得memcached?
    • 怎麼安裝memcached?
    • 哪些平台可以運作memcached?
    • 什麼情況下适合使用memcached?
    • 什麼情況下适合使用memcached?
    • 怎麼通路memcached?
    • 怎麼把memcached當成database使用?
    • 能夠周遊memcached中所有的item嗎?

一般的問題

什麼是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
    • 2008/08
      • Memcached versus more rdbms sharding at highscalability.com
      • Should you use memcached? Should you just shard mysql more? by dormando

怎麼通路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是一個緩存,不是資料庫。Tugela 和 memcachedb 是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吧,使用主鍵通路資料,您還可以使用一個輔助索引加快搜尋速度。