JAVA MemCache 史無前例的詳細講解【轉】


非原創轉自:http://nhy520.iteye.com/blog/1775893

這篇文章是我看到的介紹的比較詳細的,入門級別算是足足夠了

 

Memcach什么是Memcache 


Memcache集群環境下緩存解決方案 


Memcache是一個高性能的分布式的內存對象緩存系統,通過在內存里維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,然后從內存中讀取,從而大大提高讀取速度。   

Memcache是danga的一個項目,最早是LiveJournal 服務的,最初為了加速 LiveJournal 訪問速度而開發的,后來被很多大型的網站采用。   

Memcached是以守護程序方式運行於一個或多個服務器中,隨時會接收客戶端的連接和操作 




為什么會有Memcache和memcached兩種名稱 

其實Memcache是這個項目的名稱,而memcached是它服務器端的主程序文件名,知道我的意思了吧。一個是項目名稱,一個是主程序文件名,在網上看到了很多人不明白,於是混用了。 





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




    上網baidu了很多東西,幾乎都差不多,而且基於java的說的很少,所有只有在研究了各個其他語言類的應用后再來嘗試在java上進行簡單的操作應用。先從memcached上進行說明,memcached的最新版是采用c語言進行開發和設計的,據說舊版的是采用perl語言開發的,而且它是一個應用軟件來的,是作為緩存服務器的服務器端運行在服務器上的,需要使用特定的語言編寫客戶端與其進行通信來進行數據的緩存和獲取。通常我們是把memcached安裝運行在web服務器上,然后通過對需要的數據進行緩存,據我目前所知,所有數據的緩存設置和存取操作,以及數據的更新后替換操作全部需要程序來進行,而不是自動進行的(自動不知道能不能成功,呵呵)。下面從一個實際的例子來應用memcached。 

    如何要下載的話,到http://danga.com/memcached/下載memcached。 




Ubuntu下安裝Memcached 
編譯前,請先確認gcc、make、patch等編譯工具是否已安裝,並可正常使用。 

  安裝Libevent 

  Libevent是一個異步事件處理軟件函式庫,以BSD許可證釋出。Memcached依賴Libevent,因此必須先編譯安裝Libevent。 




檢測libevent 安裝是否成功,輸入:# ls -al /usr/lib | grep libevent  會出現如下結果(不同的機器可能有不同的輸出): 

   yangfei@yangfei-laptop:~$ ls -al /usr/lib |grep libevent 
lrwxrwxrwx   1 root    root          21 2009-07-19 08:45 libevent-1.4.so.2 -> libevent-1.4.so.2.1.3 
-rwxr-xr-x   1 root    root      301588 2009-07-19 08:45 libevent-1.4.so.2.1.3 
-rw-r--r--   1 root    root      386638 2009-07-19 08:45 libevent.a 
lrwxrwxrwx   1 root    root          26 2009-07-19 08:45 libevent_core-1.4.so.2 -> libevent_core-1.4.so.2.1.3 
-rwxr-xr-x   1 root    root      115721 2009-07-19 08:45 libevent_core-1.4.so.2.1.3 
-rw-r--r--   1 root    root      151618 2009-07-19 08:45 libevent_core.a 
-rwxr-xr-x   1 root    root         860 2009-07-19 08:45 libevent_core.la 
lrwxrwxrwx   1 root    root          26 2009-07-19 08:45 libevent_core.so -> libevent_core-1.4.so.2.1.3 
lrwxrwxrwx   1 root    root          27 2009-07-19 08:45 libevent_extra-1.4.so.2 -> libevent_extra-1.4.so.2.1.3 
-rwxr-xr-x   1 root    root      239933 2009-07-19 08:45 libevent_extra-1.4.so.2.1.3 
-rw-r--r--   1 root    root      298406 2009-07-19 08:45 libevent_extra.a 
-rwxr-xr-x   1 root    root         867 2009-07-19 08:45 libevent_extra.la 
lrwxrwxrwx   1 root    root          27 2009-07-19 08:45 libevent_extra.so -> libevent_extra-1.4.so.2.1.3 
-rwxr-xr-x   1 root    root         825 2009-07-19 08:45 libevent.la 
lrwxrwxrwx   1 root    root          21 2009-07-19 08:45 libevent.so -> libevent-1.4.so.2.1.3 





?View Code BASH 










wget http://www.monkey.org/~provos/libevent-2.0.13-stable.tar.gz 
tar xzvf  libevent-2.0.13-stable.tar.gz 
./configure 
make 
make install 





1)安裝Memcache服務端 

sudo apt-get install memcached 

安裝完Memcache服務端以后,我們需要啟動該服務: 

memcached -d -m 128 -p 11111 -u root 


這里需要說明一下memcached服務的啟動參數: 

-p 監聽的端口 
-l 連接的IP地址, 默認是本機 
-d start 啟動memcached服務 
-d restart 重起memcached服務 
-d stop|shutdown 關閉正在運行的memcached服務 
-d install 安裝memcached服務 
-d uninstall 卸載memcached服務 
-u 以的身份運行 (僅在以root運行的時候有效) 
-m 最大內存使用,單位MB。默認64MB 
-M 內存耗盡時返回錯誤,而不是刪除項 
-c 最大同時連接數,默認是1024 
-f 塊大小增長因子,默認是1.25-n 最小分配空間,key+value+flags默認是48 
-h 顯示幫助 






查看是否建立成功 

telnet測試memcached 
telnet 192.168.1.2 11211 

Trying 192.168.1.2... 
Connected to 192.168.1.2. 
Escape character is '^]' 

查看版本 

version 

… 

對Memcached緩存服務的狀態查詢,可以先telnet連接上服務:telnet 127.0.0.1 11211 ,然后使用 stats命令查看緩存服務的狀態,會返回如下的數據:   
         time:    1255537291                               服務器當前的unix時間戳 
        total_items:    54                                     從服務器啟動以后存儲的items總數量 
         connection_structures:    19                    服務器分配的連接構造數 
        version:    1.2.6                                        memcache版本 
        limit_maxbytes:    67108864                    分配給memcache的內存大小(字節) 
        cmd_get:    1645                                      get命令(獲取)總請求次數 
        evictions:    0                                            為獲取空閑內存而刪除的items數(分配給memcache的空間用滿后需 
                                                                          要刪除舊的items來得到空間分配給新的items) 
         total_connections:    19                           從服務器啟動以后曾經打開過的連接數 
        bytes:    248723                                      當前服務器存儲items占用的字節數 
        threads:    1                                             當前線程數 
        get_misses:    82                                      總未命中次數 
        pointer_size:    32                                    當前操作系統的指針大小(32位系統一般是32bit) 
         bytes_read:    490982                              總讀取字節數(請求字節數) 
        uptime:    161                                           服務器已經運行的秒數 
        curr_connections:    18                             當前打開着的連接數 
        pid:    2816                                               memcache服務器的進程ID 
         bytes_written:    16517259                     總發送字節數(結果字節數) 
        get_hits:    1563                                      總命中次數 
        cmd_set:    54                                          set命令(保存)總請求次數 
        curr_items:    28                                       服務器當前存儲的items數量 


Ok,安裝memcached1.4.5成功。 









































初始化:memcache 




Java代碼  
1. static {  
2.         String[] serverlist = { "server1.com:port", "server2.com:port" };  
3.    
4.         SockIOPool pool = SockIOPool.getInstance();  
5.         pool.setServers(serverlist);  
6.         pool.initialize();  
7.  }  
8.    

創建一個client對象: 



Java代碼  
1. MemCachedClient mc = new MemCachedClient();  

創建一個緩存: 



Java代碼  
1. MemCachedClient mc = new MemCachedClient();  
2.  String key = "cacheKey1";  
3.  Object value = SomeClass.getObject();  
4.  mc.set(key, value);  

通過key刪除一個緩存: 



Java代碼  
1. MemCachedClient mc = new MemCachedClient();  
2.  String key = "cacheKey1";  
3.  mc.delete(key);  

通過key獲取緩存對象: 



Java代碼  
1. MemCachedClient mc = new MemCachedClient();  
2.  String key = "key";  
3.  Object value = mc.get(key);  

獲取多個緩存對象: 



Java代碼  
1. MemCachedClient mc = new MemCachedClient();  
2.  String[] keys = { "key", "key1", "key2" };  
3.  Map<Object> values = mc.getMulti(keys);  

刷新全部緩存: 



Java代碼  
1. MemCachedClient mc = new MemCachedClient();  
2.  mc.flushAll();  




3. 如何在Java開發中使用Memcache 

在Java開發中使用Memcache,一般要用到以下幾個程序: 

1)      Memcached 

該程序用來在Linux或Windows服務器上建立和管理緩存。 

其項目網址為:http://danga.com/memcached/。 

2)      Magent 

Magent是一款開源的Memcached代理服務器軟件,使用它可以搭建高可用性的集群應用的Memcached服務,其項目網址為:http://code.google.com/p/memagent/。 

3)      Memcached客戶端程序 

至於Memcached的客戶端程序,一般推薦用memcached client for java,為什么推薦用這種客戶端,后面會講到具體的原因,其項目的網址為:http://github.com/gwhalin/Memcached-Java-Client/。 

4)      其它程序 
i.              Libevent 

在Linux環境下應用Memcache時,Memcache用到了libevent這個庫,用於Socket的處理,所以還需要安裝libevent。libevent的最新版本是libevent-1.4.13。(如果你的系統已經安裝了libevent,可以不用安裝)。 

官網:http://www.monkey.org/~provos/libevent/ 

下載:http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz 

ii.              Windows下的安裝程序 

Memcache也可以安裝在Windows服務器下,安裝程序:memcached-1.2.1-win32.zip 


可以從這里下載:http://jehiah.cz/projects/memcached-win32/。 







四、            原理與部署 
1. magent的hash算法 

magent采用的是:Consistent Hashing原理,Consistent Hashing如下所示:首先求出memcached服務器(節點)的哈希值, 並將其配置到0~232的圓(continuum)上。 然后用同樣的方法求出存儲數據的鍵的哈希值,並映射到圓上。然后從數據映射到的位置開始順時針查找,將數據保存到找到的第一個服務器上。 如果超過232仍然找不到服務器,就會保存到第一台memcached服務器上。 

從上圖的狀態中添加一台memcached服務器。余數分布式算法由於保存鍵的服務器會發生巨大變化 而影響緩存的命中率,但Consistent Hashing中,只有在continuum上增加服務器的地點逆時針方向的第一台服務器上的鍵會受到影響。 

2. 部署示意圖 

Java開發中的Memcache原理及實現(四)原理與部署 









3. 搭建memcache集群服務 

利用magent實現對memecache的分布式管理,搭建一套memcache集群服務: 

?  前端java對magent的訪問跟對memcache訪問相同,不需要做任何更改,對於插入的key,magent會把值散列到各個memcache服務上,只操作magent,不用關心后端處理; 

?  項目應用:以深圳電信為例,其商呼系統如圖部署三台機器做為集群,假設IP分別是:10.11.15.31, 10.11.15.32, 10.11.15.33; 

?  每個前端安裝memcached服務(大內存機器可以啟動多個服務),如端口都為12001,每個前端都安裝magent服務,端口都為12000,后端掛載全部機器的memcached服務, 

?  啟動參數示例:magent -p 12000 -s 10.11.15.31:12001 -s 10.11.15.32:12001 -s 10.11.15.33:12001,這里將三台機器都配置進來,如集集群增加了機器,只需要在啟動參數里添加進來即可。所有前端配置都是相同的,任何一個前端只需訪問本地端口的magent,這樣的memcache集群對應用帶來很大便利。 

?  這種部署可以解決session共享的應用 

項目中多處已經實際應用,magent對memcache的均衡和穩定性都非常不錯,推薦使用。 



五、            測試Memcached流程 

此處以二機集群為例。 

1. 啟動Memcached及代理 

啟動兩個memcached進程,端口分別為11211和11212: 

memcached -m 1 -u root -d -l 127.0.0.1 -p 11211 

memcached -m 1 -u root -d -l 127.0.0.1 -p 11212 

再啟動兩個magent進程,端口分別為10000和11000: 

magent -u root -n 51200 -l 127.0.0.1 -p 10000 -s 127.0.0.1:11211 -b 127.0.0.1:11212 

magent -u root -n 51200 -l 127.0.0.1 -p 11000 -s 127.0.0.1:11212 -b 127.0.0.1:11211 

-s 為要寫入的memcached, -b 為備份用的memcached。 

說明:測試環境用magent和memached的不同端口來實現,在生產環境中可以將magent和memached作為一組放到兩台服務器上。也就是說通過magent能夠寫入兩個memcached。 

2. 數據讀寫測試 

[root@odb ~]# telnet 127.0.0.1 10000 

Trying 127.0.0.1… 

Connected to localhost.localdomain (127.0.0.1). 

Escape character is ‘^]’. 

set key 0 0 8                       <—在10000端口設置key的值 

88888888 

STORED 

quit 

Connection closed by foreign host. 



[root@odb ~]# telnet 127.0.0.1 11211 

Trying 127.0.0.1… 

Connected to localhost.localdomain (127.0.0.1). 

Escape character is ‘^]’. 

get key                     <—在11211端口獲取key的值成功 

VALUE key 0 8 

88888888 

END 

quit 

Connection closed by foreign host. 



[root@odb ~]# telnet 127.0.0.1 11212 

Trying 127.0.0.1… 

Connected to localhost.localdomain (127.0.0.1). 

Escape character is ‘^]’. 

get key                     <—在11212端口獲取key的值成功 

VALUE key 0 8 

88888888 

END 

quit 

Connection closed by foreign host. 

3. 高可靠性測試 

[root@odb ~]# ps aux |grep -v grep |grep memcached 

root     23455  0.0  0.0  5012 1796 ?        Ss   09:22   0:00 memcached -m 1 -u root -d -l 127.0.0.1 -p 11212 

root     24950  0.0  0.0  4120 1800 ?        Ss   10:58   0:00 memcached -m 1 -u root -d -l 127.0.0.1 -p 11211 

[root@odb ~]# ps aux |grep -v grep |grep ‘magent -u’ 

root     25919  0.0  0.0  2176  484 ?        Ss   12:00   0:00 magent -u root -n 51200 -l 127.0.0.1 -p 10000 -s 127.0.0.1:11211 -b 127.0.0.1:11212 

root     25925  0.0  0.0  3004  484 ?        Ss   12:00   0:00 magent -u root -n 51200 -l 127.0.0.1 -p 11000 -s 127.0.0.1:11212 -b 127.0.0.1:11211 



[root@odb ~]# telnet 127.0.0.1 10000 

Trying 127.0.0.1… 

Connected to localhost.localdomain (127.0.0.1). 

Escape character is ‘^]’. 

set stone 0 0 6                      <—在10000端口設置stone的值 

123456 

STORED 

quit 

Connection closed by foreign host. 



[root@odb ~]# telnet 127.0.0.1 11000 

Trying 127.0.0.1… 

Connected to localhost.localdomain (127.0.0.1). 

Escape character is ‘^]’. 

set shidl 0 0 6                 <—在11000端口設置shidl的值 

666666 

STORED 

get stone                     <—在11000端口獲取stone的值成功 

VALUE stone 0 6 

123456 

END 

incr stone 2                   <—在11000端口修改stone的值成功 

123458 

get stone 

VALUE stone 0 6               <—在11000端口驗證stone的值,證明上面的修改成功 

123458 

END 

get shidl                     <—在11000端口獲取shidl的值成功 

VALUE shidl 0 6 

666666 

END 

quit                             <—退出11000端口 

Connection closed by foreign host. 



[root@odb ~]# telnet 127.0.0.1 10000 

Trying 127.0.0.1… 

Connected to localhost.localdomain (127.0.0.1). 

Escape character is ‘^]’. 

get stone                     <—在10000端口獲取stone的值,已被修改 

VALUE stone 0 6 

123458 

END 

get shidl                      <—在10000端口獲取shidl的值成功 

VALUE shidl 0 6 

666666 

END 

delete shidl                   <—在10000端口刪除shidl 

DELETED 

get shidl                      <—在10000端口刪除shidl生效 

END 

quit 

Connection closed by foreign host. 



[root@odb ~]# telnet 127.0.0.1 11000 

Trying 127.0.0.1… 

Connected to localhost.localdomain (127.0.0.1). 

Escape character is ‘^]’. 

get shidl                      <—在11000端口驗證刪除shidl生效 

END 

get stone                     <—在11000端口獲取stone的值成功 

VALUE stone 0 6 

123458 

END 

quit 

Connection closed by foreign host. 

4. Down機模擬測試1 
1)      Down掉11211端口的memcached 

[root@odb ~]# kill -9 24950 

[root@odb ~]# telnet 127.0.0.1 10000 

Trying 127.0.0.1… 

Connected to localhost.localdomain (127.0.0.1). 

Escape character is ‘^]’. 

get stone                      <—在10000依然可以獲取stone的值 

VALUE stone 0 6 

123458 

END 

quit 

Connection closed by foreign host. 



[root@odb ~]# telnet 127.0.0.1 11000 

Trying 127.0.0.1… 

Connected to localhost.localdomain (127.0.0.1). 

Escape character is ‘^]’. 

get stone                      <—在11000依然可以獲取stone的值 

VALUE stone 0 6 

123458 

END 

quit 

Connection closed by foreign host. 



5. Down機模擬測試2 
1)      Down掉11000端口的magent 

[root@odb ~]# kill -9 25925 

[root@odb ~]# telnet 127.0.0.1 10000 

Trying 127.0.0.1… 

Connected to localhost.localdomain (127.0.0.1). 

Escape character is ‘^]’. 

get stone                      <—在10000依然可以獲取stone的值 

VALUE stone 0 6 

123458 

END 

quit 

Connection closed by foreign host. 



2)      重啟11000端口的magent 

[root@lh-web-test memcached-1.4.5]# magent -u root -n 51200 -l 127.0.0.1 -p 11000 -s 127.0.0.1:11212 -b 127.0.0.1:11211 

[root@lh-web-test memcached-1.4.5]# telnet 127.0.0.1 11000 

Trying 127.0.0.1... 

Connected to localhost.localdomain (127.0.0.1). 

Escape character is '^]'. 

get stone                                         <—在11000依然可以獲取stone的值 

VALUE stone 0 6 

123458 

END 

quit 

Connection closed by foreign host. 










七、            Memcached客戶端程序 


Memcached的java客戶端已經存在三種了: 

?  官方提供的基於傳統阻塞io由Greg Whalin維護的客戶端 

?  Dustin Sallings實現的基於java nio的Spymemcached 

?  XMemcached 

1. 三種API比較 
1)      memcached client for java 

較早推出的memcached JAVA客戶端API,應用廣泛,運行比較穩定。 

2)      spymemcached 

A simple, asynchronous, single-threaded memcached client written in java. 支持異步,單線程的memcached客戶端,用到了java1.5版本的concurrent和nio,存取速度會高於前者,但是穩定性不好,測試中常報timeOut等相關異常。 

3)      xmemcached 

XMemcached同樣是基於java nio的客戶端,java nio相比於傳統阻塞io模型來說,有效率高(特別在高並發下)和資源耗費相對較少的優點。傳統阻塞IO為了提高效率,需要創建一定數量的連接形成連接池,而nio僅需要一個連接即可(當然,nio也是可以做池化處理),相對來說減少了線程創建和切換的開銷,這一點在高並發下特別明顯。因此XMemcached與Spymemcached在性能都非常優秀,在某些方面(存儲的數據比較小的情況下)Xmemcached比Spymemcached的表現更為優秀,具體可以看這個Java Memcached Clients Benchmark。 

2.  建議 

由於memcached client for java發布了新版本,性能上有所提高,並且運行穩定,所以建議使用memcached client for java。 

XMemcached也使用得比較廣泛,而且有較詳細的中文API文檔,具有如下特點:高性能、支持完整的協議、支持客戶端分布、允許設置節點權重、動態增刪節點、支持JMX、與Spring框架和Hibernate-memcached的集成、客戶端連接池、可擴展性好等。 

下面給出這三種客戶端的示例程序。 

3.  示例程序 
1)      memcached client for java 

從前面介紹的Java環境的Memcached客戶端程序項目網址里,下載最新版的客戶端程序包:java_memcached-release_2.5.1.zip,解壓后,文件夾里找到java_memcached-release_2.5.1.jar,這個就是客戶端的JAR包。將此JAR包添加到項目的構建路徑里,則項目中,就可以使用Memcached了。 

示例代碼如下: 

package temp; 



import com.danga.MemCached.*; 

import org.apache.log4j.*; 



public class CacheTest { 

    public static void main(String[] args) { 

       /** 

        * 初始化SockIOPool,管理memcached的連接池 

        * */ 

       String[] servers = { "10.11.15.222:10000" }; 

       SockIOPool pool = SockIOPool.getInstance(); 

       pool.setServers(servers); 

       pool.setFailover(true); 

       pool.setInitConn(10); 

       pool.setMinConn(5); 

       pool.setMaxConn(250); 

       pool.setMaintSleep(30); 

       pool.setNagle(false); 

       pool.setSocketTO(3000); 

       pool.setAliveCheck(true); 

       pool.initialize(); 

       

       /** 

        * 建立MemcachedClient實例 

        * */ 

       MemCachedClient memCachedClient = new MemCachedClient(); 

       for (int i = 0; i < 1000; i++) { 

           /** 

            * 將對象加入到memcached緩存 

            * */ 

           boolean success = memCachedClient.set("" + i, "Hello!"); 

           /** 

            * 從memcached緩存中按key值取對象 

            * */ 

           String result = (String) memCachedClient.get("" + i); 

           System.out.println(String.format("set( %d ): %s", i, success)); 

           System.out.println(String.format("get( %d ): %s", i, result)); 

       } 

    } 



2)      spymemcached 

spymemcached當前版本是2.5版本,官方網址是:http://code.google.com/p/spymemcached/。可以從地址:http://spymemcached.googlecode.com/files/memcached-2.5.jar下載最新版本來使用。 

示例代碼如下: 

package temp; 



import java.net.InetSocketAddress; 

import java.util.concurrent.Future; 



import net.spy.memcached.MemcachedClient; 



public class TestSpyMemcache { 

    public static void main(String[] args) { 

       // 保存對象 

       try { 

           /* 建立MemcachedClient 實例,並指定memcached服務的IP地址和端口號 */ 

           MemcachedClient mc = new MemcachedClient(new InetSocketAddress("10.11.15.222", 10000)); 

           Future<Boolean> b = null; 

           /* 將key值,過期時間(秒)和要緩存的對象set到memcached中 */ 

           b = mc.set("neea:testDaF:ksIdno", 900, "someObject"); 

           if (b.get().booleanValue() == true) { 

              mc.shutdown(); 

           } 

       } catch (Exception ex) { 

           ex.printStackTrace(); 

       } 

       // 取得對象 

        try { 

           /* 建立MemcachedClient 實例,並指定memcached服務的IP地址和端口號 */ 

           MemcachedClient mc = new MemcachedClient(new InetSocketAddress("10.11.15.222", 10000)); 

           /* 按照key值從memcached中查找緩存,不存在則返回null */ 

           Object b = mc.get("neea:testDaF:ksIdno"); 

           System.out.println(b.toString()); 

           mc.shutdown(); 

       } catch (Exception ex) { 

           ex.printStackTrace(); 

       } 

    } 



3)      xmemcached 

Xmemcached的官方網址是:http://code.google.com/p/xmemcached/,可以從其官網上下載最新版本的1.2.4來使用。地址是:http://xmemcached.googlecode.com/files/xmemcached-1.2.4-src.tar.gz。 

示例代碼如下: 

package temp; 



import java.io.IOException; 

import java.util.concurrent.TimeoutException; 



import net.rubyeye.xmemcached.utils.AddrUtil; 

import net.rubyeye.xmemcached.MemcachedClient; 

import net.rubyeye.xmemcached.MemcachedClientBuilder; 

import net.rubyeye.xmemcached.XMemcachedClientBuilder; 

import net.rubyeye.xmemcached.exception.MemcachedException; 



public class TestXMemcache { 

    public static void main(String[] args) { 

       MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil 

              .getAddresses("10.11.15.222:10000")); 

       MemcachedClient memcachedClient; 

       try { 

           memcachedClient = builder.build(); 

       

           memcachedClient.set("hello", 0, "Hello,xmemcached"); 

           String value = memcachedClient.get("hello"); 

           System.out.println("hello=" + value); 

           memcachedClient.delete("hello"); 

           value = memcachedClient.get("hello"); 

           System.out.println("hello=" + value); 

           // close memcached client 

           memcachedClient.shutdown(); 

       } catch (MemcachedException e) { 

           System.err.println("MemcachedClient operation fail"); 

           e.printStackTrace(); 

       } catch (TimeoutException e) { 

           System.err.println("MemcachedClient operation timeout"); 

           e.printStackTrace(); 

       } catch (InterruptedException e) { 

           // ignore 

       }catch (IOException e) { 

           System.err.println("Shutdown MemcachedClient fail"); 

           e.printStackTrace(); 

       } 

    } 









(八)  64位機器安裝Memcache 
1.   安裝 

在64位的機器上安裝Memcache和在32位的機器上安裝的操作是一樣的。在安裝的過程中,可以使用如下的命令來查看安裝是否成功,以進行確認。 

1)   確認libevent安裝 

查看libevent是否安裝成功: 

# ls -al /usr/lib | grep libevent 

在命令行出現如下信息,表明安裝成功: 

   lrwxrwxrwx   1 root root     21 Mar 22 18:41 libevent-1.2.so.1 -> libevent-1.2.so.1.0.3 

   -rwxr-xr-x   1 root root 262475 Mar 22 18:41 libevent-1.2.so.1.0.3 

   -rw-r--r--   1 root root 430228 Mar 22 18:41 libevent.a 

   -rwxr-xr-x   1 root root    811 Mar 22 18:41 libevent.la 

   lrwxrwxrwx   1 root root     21 Mar 22 18:41 libevent.so -> libevent-1.2.so.1.0.3 

2)   確認memcache安裝 

查看memcache是否安裝成功: 

# ls -al /usr /bin/mem* 

在命令行出現如下信息,表明安裝成功: 

   -rwxr-xr-x  1 root root 114673 Mar 22 18:52 /usr/local/src/memcached 

   -rwxr-xr-x  1 root root 120092 Mar 22 18:52 /usr/local/src/memcached-debug 

2.   64位的問題及修復 
1)   問題 

安裝完成了,現在我們看一下memcache的幫助: 

#/usr/local/src/memecached -h 

這時候出現了如下錯誤: 

   memcached: error while loading shared libraries: libevent-1.2.so.1: cannot open shared    object file: No such file or directory 

2)   修復 

下面說下修復過程: 

#LD_DEBUG=libs memcached -v #查看memcached的libs的路徑 

在命令上出現了如下信息: 

5427:     find library=libevent-1.2.so.1 [0]; searching 

5427:      search cache=/etc/ld.so.cache 

5427: search        path=/lib64/tls/x86_64:/lib64/tls:/lib64/x86_64:/lib64:/usr/lib64/tls/x86_64:/usr/lib64/tls:/usr/lib64/x86_64: 

/usr/lib64              (system search path) 

5427:       trying file=/lib64/tls/x86_64/libevent-1.2.so.1 

5427:       trying file=/lib64/tls/libevent-1.2.so.1 

5427:       trying file=/lib64/x86_64/libevent-1.2.so.1 

5427:       trying file=/lib64/libevent-1.2.so.1 

5427:       trying file=/usr/lib64/tls/x86_64/libevent-1.2.so.1 

5427:       trying file=/usr/lib64/tls/libevent-1.2.so.1 

5427:       trying file=/usr/lib64/x86_64/libevent-1.2.so.1 

5427:       trying file=/usr/lib64/libevent-1.2.so.1 

5427:            memcached: error while loading shared libraries: libevent-1.2.so.1: cannot open shared object file: No such                   file or directory 

現在應該記錄下來libs的位置,我選擇的是trying file=/usr/lib64/libevent-1.2.so.1,現在我們利用這個來做個符號鏈接: 

# ln -s /usr/lib/libevent-1.4.so.2 /usr/lib64/libevent-1.4.so.2 

下面我們繼續使用memcached -h做下測試,終於出現了如下信息: 

    memcached 1.2.0 

    -p <num>      port number to listen on 

    -s <file>     unix socket path to listen on (disables network support) 

    -l <ip_addr>  interface to listen on, default is INDRR_ANY 

    -d            run as a daemon 

    -r            maximize core file limit 

    -u <username> assume identity of <username> (only when run as root) 

    -m <num>      max memory to use for items in megabytes, default is 64 MB 

    -M            return error on memory exhausted (rather than removing items) 

    -c <num>      max simultaneous connections, default is 1024 

    -k            lock down all paged memory 

    -v            verbose (print errors/warnings while in event loop) 

    -vv           very verbose (also print client commands/reponses) 

    -h            print this help and exit 

    -i            print memcached and libevent license 

    -b            run a managed instanced (mnemonic: buckets) 

    -P <file>     save PID in <file>, only used with -d option 

    -f <factor>   chunk size growth factor, default 1.25 

    -n <bytes>    minimum space allocated for key+value+flags, default 48 

說明memcached安裝成功。(應該是機器是64位的原因,所以將so文件放到了lib64下面,而不是lib下面,使得memcached找不到了so文件)。 

下面,我們來啟動一個Memcached的服務器端: 

# /usr/local/src/memcached -d -m 10  -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid 




(九)    Windows下的Memcache安裝 
1.  安裝 


在這里簡單介紹一下Windows下的Memcache的安裝: 

1. 下載memcache的windows穩定版,解壓放某個盤下面,比如在c:\memcached 

2. 在終端(也即cmd命令界面)下輸入‘c:\memcached\memcached.exe -d install’安裝 

3. 再輸入:‘c:\memcached\memcached.exe -d start’啟動。NOTE: 以后memcached將作為windows的一個服務每次開機時自動啟動。這樣服務器端已經安裝完畢了。 

2.  memcached的基本設置 

?  -p 監聽的端口 

?  -l 連接的IP地址, 默認是本機 

?  -d start 啟動memcached服務 

?  -d restart 重起memcached服務 

?  -d stop|shutdown 關閉正在運行的memcached服務 

?  -d install 安裝memcached服務 

?  -d uninstall 卸載memcached服務 

?  -u 以的身份運行 (僅在以root運行的時候有效) 

?  -m 最大內存使用,單位MB。默認64MB 

?  -M 內存耗盡時返回錯誤,而不是刪除項 

?  -c 最大同時連接數,默認是1024 

?  -f 塊大小增長因子,默認是1.25 

?  -n 最小分配空間,key+value+flags默認是48 

?  -h 顯示幫助 

3.  設置Memcache緩存大小和端口 

Memcache的默認啟動時的參數可能不滿足實際生產環境的需要,於是就想到直接修改windows服務的啟動參數,操作如下: 

打開注冊表,找到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server 

其中的ImagePath項的值為: c:\memcached\memcached.exe" -d runservice 

改成:c:\memcached\memcached.exe" -p 12345 -m 128 -d runservice 

其中,-p就是端口,-m就是緩存大小,以M為單位。 

在CentOS 5.6上編譯安裝Memcached 

1、由於memcached是基於libevent的,因此需要安裝libevent,libevent-devel 
view plain   copy1.# yum install libevent libevent-devel -y  
2、下載並解壓memcached-1.4.5 

memcached官方網站是:http://memcached.org/ 
view plain   copy1.# cd /root 2.# wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz 3.# tar -xvzf  memcached-1.4.5.tar.gz  
3、編譯安裝memcached-1.4.5 
view plain   copy1.# cd memcached-1.4.5 2.# ./configure --prefix=/etc/memcached 3.# make 4.# make install  
4、配置環境變量 

進入用戶宿主目錄,編輯.bash_profile,為系統環境變量LD_LIBRARY_PATH增加新的目錄,需要增加的內容如下: 

# vi .bash_profile 
view plain   copy1.MEMCACHED_HOME=/etc/memcached 2.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MEMCACHED_HOME/lib  
刷新用戶環境變量:# source .bash_profile 

5、編寫memcached服務啟停腳本 

# cd /etc/init.d 

vi memcached,腳本內容如下: 
view plain   copy1.#!/bin/sh 2.# 3.# Startup script for the server of memcached 4.# 5.# processname: memcached 6.# pidfile: /etc/memcached/memcached.pid 7.# logfile: /etc/memcached/memcached_log.txt 8.# memcached_home: /etc/memcached 9.# chkconfig: 35 21 79 10.# description: Start and stop memcached Service 11. 12.# Source function library 13.. /etc/rc.d/init.d/functions 14. 15.RETVAL=0 16. 17.prog="memcached" 18.basedir=/etc/memcached 19.cmd=${basedir}/bin/memcached 20.pidfile="$basedir/${prog}.pid" 21.#logfile="$basedir/memcached_log.txt" 22. 23.# 設置memcached啟動參數 24.ipaddr="192.168.1.201"          # 綁定偵聽的IP地址 25.port="11211"                    # 服務端口 26.username="root"                 # 運行程序的用戶身份 27.max_memory=64                   # default: 64M | 最大使用內存 28.max_simul_conn=1024             # default: 1024 | 最大同時連接數 29.#maxcon=51200 30.#growth_factor=1.3              # default: 1.25 | 塊大小增長因子 31.#thread_num=6                   # default: 4 32.#verbose="-vv"                  # 查看詳細啟動信息 33.#bind_protocol=binary           # ascii, binary, or auto (default) 34. 35.start() { 36.    echo -n $"Starting service: $prog" 37.    $cmd -d -m $max_memory -u $username -l $ipaddr -p $port -c $max_simul_conn -P $pidfile 38.    RETVAL=$? 39.    echo 40.    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog 41.} 42. 43.stop() { 44.    echo -n $"Stopping service: $prog  " 45.    run_user=`whoami` 46.        pidlist=`ps -ef | grep $run_user | grep memcached | grep -v grep | awk '{print($2)}'` 47.        for pid in $pidlist 48.        do 49.#           echo "pid=$pid" 50.            kill -9 $pid 51.            if [ $? -ne 0 ]; then 52.                return 1 53.            fi 54.        done 55.    RETVAL=$? 56.    echo 57.    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog 58.} 59. 60.# See how we were called. 61.case "$1" in 62.    start) 63.        start 64.        ;; 65.    stop) 66.        stop 67.        ;; 68.    #reload) 69.    #    reload 70.    #    ;; 71.    restart) 72.        stop 73.        start 74.        ;; 75.    #condrestart) 76.    #    if [ -f /var/lock/subsys/$prog ]; then 77.    #        stop 78.    #        start 79.    #    fi 80.    #    ;; 81.    status) 82.        status memcached 83.        ;; 84.    *) 85.        echo "Usage: $0 {start|stop|restart|status}" 86.        exit 1 87.esac 88. 89.exit $RETVAL  
設置腳本可被執行:# chmod +x memcached 

6、設置memcached隨系統啟動 
view plain   copy1.# chkconfig --add memcached 2.# chkconfig --level 35 memcached on  
啟動memcached 
view plain   copy1.# service memcached start 2.//啟動的時候實際上是調用了下面的這個命令,以守護進程的方式來啟動memcached  3./etc/memcached/bin/memcached -d -m 64 -u root -l 192.168.1.201  4.\-p 11211 -c 1024 -P /etc/memcached/memcached.pid  
查看memcached是否啟動: 

# ps -ef | grep memcached 

memcached命令參數解釋 


參數
參數解釋及說明 

 

-p <num> 
監聽的端口 

-l <ip_addr> 
連接的IP地址,,默認是本機。-l選項可以不使用,此時表示在所有網絡接口地址上監聽。建議是-l <ip_addr>指定一個內部網絡IP地址,以避免成為外部網絡攻擊的對象 

-d start 
啟動memcached 服務 

-d restart 
重起memcached 服務 

-d stop|shutdown 
關閉正在運行的memcached 服務 

-d install 
安裝memcached 服務 

-d uninstall 
卸載memcached 服務 

-u <username> 

以<username>的身份運行 (僅在以root運行的時候有效) 

-m <num> 

最大內存使用,單位MB。默認64MB 

-M 
內存耗盡時返回錯誤,而不是刪除項 

-c <num> 
最大同時連接數,默認是1024 

-f <factor> 
塊大小增長因子,默認是1.25 

-n <bytes> 
最小分配空間,key+value+flags默認是48 

-h 
顯示幫助 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM