posts - 297,  comments - 1618,  trackbacks - 0

           

          ——Memcached的安裝、使用實例

          文:阿蜜果

          日期:2011-2-15
          版權所有,轉載請注明出處:http://www.aygfsteel.com/amigoxie/archive/2011/02/15/344381.html

          1、Memcached介紹

          Memcached是高性能的,分布式的內存對象緩存系統,用于在動態應用中減少數據庫負載,提升訪問速度。MemcachedDanga Interactive開發,用于提升LiveJournal.com訪問速度的。LJ每秒動態頁面訪問量幾千次,用戶700萬。Memcached將數據庫負載大幅度降低,更好的分配資源,更快速訪問。

          Memcached的最新版是采用c語言進行開發和設計的,它是一個應用軟件,是作為緩存服務器的服務器端運行在服務器上的,需要使用特定的語言編寫客戶端與其進行通信來進行數據的緩存和獲取。

          在系統中,通常將Memcached安裝運行在服務器上,然后通過對需要的數據進行緩存,所有數據的緩存設置和存取操作,以及數據的更新后替換操作全部需要程序來進行。

          2、Memcached的安裝

          2.1 主程序的安裝

          一般的服務器都是采用Linux,筆者只是講述在Windows上如何安裝Memcached,在Linux上的安裝請參考網上其它資料。

          Windows版本的下載地址為:http://code.jellycan.com/memcached/

          當前win32的最新版本是1.2.6,下載頁面參考如下:
             

          在上圖中點擊“memcached-1.2.6-win32-bin.zip”進入下載頁面,下載后,將其解壓到D盤下,解壓后的D:"memcached-1.2.6-win32-bin目錄下有一個memcached.exe。

          Windows的命令行(cmd命令進入命令行)窗口進入該目錄,首先運行:

          memcached.exe -d install

          上面這行表示安裝Memcached為服務,這樣才能正常運行。接著運行如下這樣來啟動Memcached,還可指定-l參數,表示啟動的IP,-m表示緩存大?。?/p>

          memcached.exe -d start

          若指定了-m,則表示緩存大小為-m后的數字,單位是M,例如:

          memcached.exe –l 127.0.0.1 –m 32 -d start

          運行參考如下圖所示:
            

          2.2 Java客戶端的安裝

          下載地址為:https://github.com/gwhalin/Memcached-Java-Client

          下載頁面參考如下:
            

                   在上圖中點擊右側區域的“Downloads”,彈出的下載小窗口如下圖:
             

                   當前最新的版本是2.5.2,點擊“java_memcached-release_2.5.2.zip”下載。下載后解壓,目錄結構如下圖所示:
             

                   在應用中,需要將“java_memcached-release_2.5.2.jar”包拷貝到Java項目中。

          3、Memcached的使用

          3.1 創建項目

          MyEclipse中創建一個名為memcacheddemo的測試項目,src放源代碼,binclasses文件,libjar包,并將java_memcached-release_2.5.2.jar拷貝到lib目錄中,目錄結構如下:
            

          3.2 SockIOPool類及其常用方法

                   SockIOPoolsocket連接池類,常用方法如下:

          setServers(String[] servers):設置服務器信息數組;

          setWeights(String[] weights):設置服務器權重數組;

          setInitConn(int count):設置初始連接數;

          setMinConn(int minConn):設置最小連接數;

          setMaxConn(int maxConn):設置最大連接數;

          setMaxIdle(long arg0):設置最大處理時間;

          setMaintSleep(long arg0):主線程的睡眠時間;

          initialize():初始化連接池。

          3.3 MemCachedClient類及其常用方法

                   MemCachedClient類用于對Memcached內存對象緩存系統進行操作,常用方法如下:

          add(String key, Object value):添加一個鍵值對到緩存中;

          add(String key, Object value,Date expires):添加一個鍵值對到緩存中,并設置其超時時間;

          set(String key, Object value):在緩存中設置一個鍵的值;

          set(String key, Object value, Date expires):在緩存中設置一個鍵的值,并設置其超時時間;

          get(String key):獲得某個鍵的值。

          incr(String key):為某個鍵上的值執行+1操作;

          decr(String key):為某個鍵上的值執行-1操作;

          replace(String key, String value):將某個鍵的值替換成新的值;

          replace(String key, String value, Date expires):將某個鍵的值替換成新的值,并設置其超時時間。

          3.4 使用實例

                   memcacheddemo工程的源碼目錄創建測試的JavaMemcachedTest,該類的代碼參考如下:

          import java.util.Date;

          import com.danga.MemCached.MemCachedClient;
          import com.danga.MemCached.SockIOPool;

          /**
           * 使用memcached的緩存測試類.
           * 
          @author 阿蜜果
           
          */

          public class MemcachedTest {
              
          // 創建全局的唯一實例
              protected static MemCachedClient mcc = new MemCachedClient();

              
          protected static MemcachedTest memCached = new MemcachedTest();

              
          // 設置與緩存服務器的連接池
              static {
                  
          // 服務器列表和其權重
                  String[] servers = {"127.0.0.1:11211"};
                  Integer[] weights 
          = {3};

                  
          // 獲取socket連接池的實例對象
                  SockIOPool pool = SockIOPool.getInstance();

                  
          // 設置服務器信息
                  pool.setServers(servers);
                  pool.setWeights(weights);

                  
          // 設置初始連接數、最小和最大連接數以及最大處理時間
                  pool.setInitConn(5);
                  pool.setMinConn(
          5);
                  pool.setMaxConn(
          250);
                  pool.setMaxIdle(
          1000 * 60 * 60 * 6);

                  
          // 設置主線程的睡眠時間
                  pool.setMaintSleep(30);

                  
          // 設置TCP的參數,連接超時等
                  pool.setNagle(false);
                  pool.setSocketTO(
          3000);
                  pool.setSocketConnectTO(
          0);

                  
          // 初始化連接池
                  pool.initialize();

                  
          // 壓縮設置,超過指定大小(單位為K)的數據都會被壓縮
                  mcc.setCompressEnable(true);
                  mcc.setCompressThreshold(
          64 * 1024);
              }


              
          /**
               * 保護型構造方法,不允許實例化
               
          */

              
          protected MemcachedTest() {

              }


              
          /**
               * 獲取唯一實例.
               * 
          @return
               
          */

              
          public static MemcachedTest getInstance() {
                  
          return memCached;
              }


              
          /**
               * 添加一個指定的值到緩存中.
               * 
          @param key 鍵
               * 
          @param value 值
               * 
          @return 在緩存中若該key不存在,并成功添加返回true,否則將返回false
               
          */

              
          public boolean add(String key, Object value) {
                  
          return mcc.add(key, value);
              }


              
          /**
               * 添加一個鍵值對到緩存中.
               * 
          @param key 鍵
               * 
          @param value 值
               * 
          @param expires 超時時間
               * 
          @return 在緩存中若該key不存在,并成功添加返回true,否則將返回false
               
          */

              
          public boolean add(String key, Object value, Date expires) {
                  
          return mcc.add(key, value, expires);
              }


              
          /**
               * 將某個鍵的值改變成新值,首先需要保證該鍵存在.
               * 
          @param key 鍵
               * 
          @param value 值
               * 
          @return 成功返回true,失敗返回false
               
          */

              
          public boolean replace(String key, Object value) {
                  
          return mcc.replace(key, value);
              }


              
          /**
               * 將某個鍵的值改變成新值,首先需要保證該鍵存在.
               * 
          @param key 鍵
               * 
          @param value 值
               * 
          @param expires 超時時間
               * 
          @return 成功返回true,失敗返回false
               
          */

              
          public boolean replace(String key, Object value, Date expires) {
                  
          return mcc.replace(key, value, expires);
              }


              
          /**
               * 添加一個指定的值到緩存中.
               * 
          @param key
               * 
          @param value
               * 
          @return 成功返回true,否則返回false
               
          */

              
          public boolean set(String key, Object value) {
                  
          return mcc.set(key, value);
              }

              
              
          /**
               * 添加一個指定的值到緩存中,并設置其超時時間.
               * 
          @param key 鍵
               * 
          @param value 值
               * 
          @param expires 超時時間
               * 
          @return 成功返回true,否則返回false
               
          */

              
          public boolean set(String key, Object value, int expires) {
                  
          return mcc.set(key, value, expires);
              }

              
              
          /**
               * 根據指定的關鍵字獲取對象.
               * 
          @param key
               * 
          @return 返回value
               
          */

              
          public Object get(String key) {
                  
          return mcc.get(key);
              }


              
          /**
               * 將指定key的value值+1,將返回最后的value值
               * 
          @param key 
               * 
          @return 返回最后的value值
               
          */

              
          public long incr(String key) {
                  
          return mcc.incr(key);
              }

              
              
          /**
               * 將指定key的value值-1,將返回最后的value值
               * 
          @param key 
               * 
          @return 返回最后的value值
               
          */

              
          public long decr(String key) {
                  
          return mcc.decr(key);
              }

              
              
          /**
               * 測試方法
               * 
          @param args
               
          */

              
          public static void main(String[] args) {
                  MemcachedTest cache 
          = MemcachedTest.getInstance();
                  cache.set(
          "count"123);
                  System.out.println(
          "count=" + cache.get("count"));
                  
          boolean flag = cache.add("schedule_2""0");
                  System.out.println(
          "flag=" + flag);
                  System.out.println(
          "schedule_2=" + cache.get("schedule_2"));
              }

          }

                運行結果為:

          count=123
          flag
          =true
          schedule_2
          =0

          4、附錄

                   Memcached Java客戶端編程》:

          http://sailinglee.javaeye.com/blog/752847

          posted on 2011-02-15 18:06 阿蜜果 閱讀(3025) 評論(3)  編輯  收藏 所屬分類: Java解決方案


          FeedBack:
          # re: 在系統中使用內存對象緩存系統(下篇)[未登錄]
          2011-02-16 09:33 | roywong
          雖然以前在IBM 論壇看過類似帖子 ,但沒有樓主這么詳細的。感謝下,學習了  回復  更多評論
            
          # re: 在系統中使用內存對象緩存系統(下篇)
          2011-02-16 12:35 | 陳于喆
          memcached確實已經得到了廣泛的應用,不過始終在java的應用不如php簡便,前面我也記錄過一點memcached在java應用中碰到的一些問題和應用http://www.aygfsteel.com/dongbule/archive/2010/12/08/340066.html  回復  更多評論
            
          # re: 在系統中使用內存對象緩存系統(下篇)
          2011-02-20 17:19 | 淘寶網女裝2011春裝
          確實,博主這篇帖子寫得非常詳細,很受教??!  回復  更多評論
            
          <2011年2月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272812345
          6789101112

                生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
                我的作品:
                玩轉Axure RP  (2015年12月出版)
                

                Power Designer系統分析與建模實戰  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          關注blog

          積分與排名

          • 積分 - 2299172
          • 排名 - 3

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 富阳市| 贵定县| 安溪县| 佛山市| 龙泉市| 泊头市| 濮阳县| 井冈山市| 商南县| 新泰市| 乡城县| 铜川市| 蓝田县| 烟台市| 临高县| 文化| 漳浦县| 阳山县| 广丰县| 陆河县| 兴义市| 大渡口区| 工布江达县| 天气| 玛纳斯县| 台湾省| 盐山县| 南岸区| 临朐县| 白水县| 南乐县| 金塔县| 襄樊市| 本溪| 浦城县| 紫云| 高密市| 云南省| 满洲里市| 望城县| 常州市|