memcached是一個高性能的、分布式內存對象緩存系統,通過在內存里維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等,多用于加速WEB應用、降低數據庫負載等。Danga Interactive 開發memcached用來提高 LiveJournal.com 的速度,這個站點每天處理2000萬以上的動態頁面請求,獨立用戶有100萬左右。memcached把數據庫的負載降到了幾乎沒事可干的地步,并為用戶提供很快的頁面響應速度,更好的資源利用率和更快的數據庫存取操作。
首先啟動一個memcached監護進程,監護進程不需要配置文件,只要在命令行里面加三四個參數就可以了:
# ./memcached -d -m 2048 -l 10.0.0.40 -p 11211
這里指定使用2GB內存,監聽10.0.0.40的11211端口來啟動memcached。因為32位處理器最多只能有4GB的地址空間。如果你確實需要32位的服務器處理4-64GB的內存(使用PAE),則每個使用2-3GB內存。
數據庫為了在關系數據庫管理系統上實現ACID,使用了鎖,導致很多讀寫阻塞。而memcached從不會阻塞。首先使用緩存的很多用戶都是用于WEB。這意味著要分配時間出來做多請求處理給不同的系統,如mod_perl、PHP等等,這是對全局緩存的一種浪費。如果你使用多線程語言和共享內存API,如IPC::Shareable,你的每個線程都擁有獨立的緩存。這個也是共享內存的局限性。
memcached服務器和客戶端實現了全局緩存。實際上,很推薦你在同一臺機器上同時運行WEB結點和memcached結點。這會節省一點網絡開銷,非常快,它使用 libevent 來處理任意數量的連接。在Linux上,盡可能使用 epoll 來實現。使用非阻塞的網絡IO和計算,所以對象在不同的客戶端上可能有不同的狀態。還使用內置的內存塊分配和哈希表算法,確保虛擬內存不會過來搗亂。
你可能感興趣用戶是否會獲取一個過期的值。服務器API只有一種獲取數據的方法,并有3種提交數據的方法:
* set 無條件的設置指定的鍵為給定的值。
* add 添加到緩存,如果不存在。
* replace 當存在已有值時,替換一下。
另外,這3個函數都可以設置過期時間。