Memcached是一個開源的快速分佈式緩存框架,它和ehcached等緩存框架相比,具備下面的一些優點: 一、 跨jvm的緩存架。咱們知道,在一個jvm進程中,通常狀況下的有效內存利用最多爲2G,若是你再把數據緩存在項目的jvm進程中,勢必形成內存空間的緊 缺,嚴重的時候會出現堆棧溢出面致使項目終止運行。 二、 集羣環境下的緩存框架。Memcached啓動後,有本身的獨立IP地址及端口號(默認是11211,固然你能夠更改),所以,在集羣環境下或不一樣的幾個 項目間,均可以訪問緩存服務器中的數據,很是的方便。 下面咱們一塊兒來看一看筆者在最近的一個項目中,是如何使用memached的。 1、安裝memcached緩存服務器 若是你用的是windows服務器系統,請到http://jehiah.cz/projects/memcached-win32/下載,點其中的 exe可執行文件,Memcached就完成了啓動,很是的簡單。 若是你使用的是linux server,你須要以下的操做(以ubuntu爲例): $ sudo apt-get install memcached(安裝) $ memcached -d -m 50 -p 11211 -u root(啓動) 上面命令行參數說明:-m 指定使用多少兆的緩存空間;-p 指定要監聽的端口; -u 指定以哪一個用戶來運行,默認狀況下,會在本機的11211端口監聽操做鏈接,你能夠經過netstat –ant查看memcached是否已經正常運行。 你也能夠經過修改/etc/default/memcached配置文件,將ENABLE_MEMCACHED=yes,讓系統啓動時,自動運行 memcached,省去了每次都要手式啓動的繁瑣步驟。 2、 下載memcached的java訪問客戶端。下載地址:http://github.com/gwhalin/Memcached-Java- Client/downloads,將壓縮包中的java_memcached-release_2.5.1.jar放到你的工程目錄中。 若是你是用的PHP,Ruby等,也可在網上找到相應的訪問Memcached模塊及示例代碼。 3、在java程序中的訪問。 首 先要強調一下,放入memcached中緩存的對象,必須以鍵值對(key/value)的方式放入,取的時候根據key來取,但memcached有 幾個本身的特殊要求:key必須爲String,即字符串類型;而要緩存的對象必需要實現Serializable序列化接口。 本人以前的一個項 目中,當用戶將鼠標停留到某個單詞上時,系統要彈出該單詞的解釋及音標,因爲項目組在開發時並無 找到一套合適的詞庫,咱們的解決思路是:當有用戶查詢時,服務器向第三方翻譯網站提交單詞,再從返回的結果中解析出單詞解釋及發音。此查詢過程至關費時, 且在網絡狀態很差時表現不佳,但在當時這也許是最好的解決辦法了。 Word對象是咱們封裝的單詞音標及解釋對象,該對象實現 Serializable接口。當用戶查詢某個單詞時,咱們先會在Memcached緩存中查 找,若是沒有找到,則向數據庫查詢,若是數據庫中也沒有找到,再向第三方翻譯網站提交,獲得結果後返回給用戶後,同時要把該單詞存入數據庫,同時放入 Memcached緩存,下次有用戶查詢一樣的單詞時,效率將會獲得很是大的提高。系統獲得一個單詞翻譯的代碼以下: public Word getWordTranslate(String aWord) { // 先從緩存中取 Word word = getWordFromCache(aWord); if (word != null) { return word; } //從數據庫中取 word = wordDao.getWord(aWord); if (word != null) { //放入緩存 MemcachedAdapter.add(aWord, word);; return word; } //從網上查詞 word = translateWordFromWebSite(aWord); if (! "e".equals(tv.getWords())) { //存入數據庫 saveWord(word); //放入緩存 MemcachedAdapter.add(aWord, word); } return word; } Memcached操做代碼以下,其中的一些鏈接參數,你能夠根據你的狀況進行修改。 public class MemcachedAdapter { protected static MemCachedClient mcc = new MemCachedClient(); static { SockIOPool pool = SockIOPool.getInstance(); pool.setServers(new String[]{"127.0.0.1:11211"}); Integer[] weights = { 3 }; pool.setWeights( weights ); pool.setInitConn( 5 ); pool.setMinConn( 5 ); pool.setMaxConn( 250 ); pool.setMaxIdle( 1000 * 60 * 60 * 6 ); pool.setMaintSleep( 30 ); pool.setNagle( false ); pool.setSocketTO( 3000 ); pool.setSocketConnectTO( 0 ); pool.initialize(); } public static Object get(String key) { return mcc.get(key); } public static boolean set(String key, Object o) { return mcc.set(key, o); } public static boolean add(String key, Object o) { return mcc.add(key, o); } public static boolean replace(String key, Object o) { return mcc.replace(key, o); } public static boolean delete(String key) { return mcc.delete(key); } } 項目上線前,咱們對單詞翻譯部分進行了壓力測試,在不少用第一次查詢某個單詞的時候,速度很慢,但系統運行一段時候後,因爲經常使用單詞都在Memcached中 進行了緩存,速度上就基本就存在問題了。 最後還有一個問題要考慮,就是在操做系統從新啓動後,Memcached中緩存的數據將再也不存在,爲了效率考慮,你能夠在應用服務器啓動時,將全部的單詞 對象所有讀出,再添加到Memcahced中。