1. 程式人生 > >JAVA MemCache 史無前例的詳細講解【轉】

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

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  會出現如下結果(不同的機器可能有不同的輸出):

  
[email protected]
:~$ 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




1
2
3
4
5

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. 資料讀寫測試

[
[email protected]
~]# 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.



[[email protected] ~]# 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.



[
[email protected]
~]# 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. 高可靠性測試

[[email protected] ~]# 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

[[email protected] ~]# 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



[[email protected] ~]# 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.



[[email protected] ~]# 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.



[[email protected] ~]# 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.



[[email protected] ~]# 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

[[email protected] ~]# kill -9 24950

[[email protected] ~]# 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.



[[email protected] ~]# 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

[[email protected] ~]# kill -9 25925

[[email protected] ~]# 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

[[email protected] 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

[[email protected] 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

顯示幫助

相關推薦

JAVA MemCache 史無前例詳細講解

Memcach什麼是Memcache Memcache叢集環境下快取解決方案 Memcache是一個高效能的分散式的記憶體物件快取系統,通過在記憶體裡維護一個統一的巨大的hash表,它能夠用來儲存各種格式的資料,包括影象、視訊、檔案以及資料庫檢索的結果等。簡單的說就是將資料

Java爬蟲工程師技能列表

引擎 gin ans acl -h 挖掘 soup dns ora 掌握一半便能夠熟練的開發爬蟲玩了。自己正在努力中... 一、技能列表、掌握java、尤其編程網絡部分;李剛的java基礎至少看了三遍以上; 2、熟悉html、js、 ajax、firedebug3、網

自動化運維工具SaltStack詳細部署

lib64 time 兩個 功能 .so odi 組件 部分 srv ==========================================================================================一、基礎介紹======

一.Select 函數詳細介紹

perror socket編程 這樣的 發生 結構體 阻塞 get 成功 系統 轉自:http://www.cnblogs.com/hjslovewcl/archive/2011/03/16/2314330.html Select在Socket編程中還是比較重

JAVA 之 Tomcat知識框架

規範 分享 輕量 war dad class 重要 開發 是否 一、Tomcat服務器(很熟悉) 1、Web開發概述 javaSE: javaEE:13種 javaME: JavaEE規範: 13種技術的總稱。Servlet/Jsp JDBC JNDI JTA

java中JVM的原理

ext eas 很大的 .class trap sub jdk與jre libraries use 一、java虛擬機的生命周期:   Java虛擬機的生命周期 一個運行中的Java虛擬機有著一個清晰的任務:執行Java程序。程序開始執行時他才運行,程序結束時他就停止。你

內核中container_of宏的詳細分析

按位與 指針常量 並且 cast 例子 找到 eof 運算符 gnu 轉自:http://blog.chinaunix.net/uid-30254565-id-5637597.html 內核中container_of宏的詳細分析 16年2月2

成員函式的過載、覆蓋與隱藏(詳細

(轉自:https://blog.csdn.net/weixin_42205987/article/details/81569744) 成員函式的過載、覆蓋與隱藏 成員函式的過載(overload)、覆蓋/重寫(override)與隱藏/重定義(hide)很容易混淆,C++程式設計師必須要搞

深入理解java G1 垃圾回收器。。

本文首先簡單介紹了垃圾收集的常見方式,然後再分析了G1收集器的收集原理,相比其他垃圾收集器的優勢,最後給出了一些調優實踐。 一,什麼是垃圾回收 首先,在瞭解G1之前,我們需要清楚的知道,垃圾回收是什麼?簡單的說垃圾回收就是回收記憶體中不再使用的物件。 垃圾回收的基本步驟 回收的步驟有2步: 查詢記憶

termios結構體的詳細設定

termios結構體內容: 成員 描述 ------------------------------------------- c_cflag 控制模式標誌 c_lflag 本地模式標誌 c_iflag 輸入模式標誌 c_oflag 輸出模式標誌 c_line line

V4L2 API詳解 <二> Camera詳細設定

轉自:http://blog.sina.com.cn/s/blog_602f87700101bf36.html 作者: Sam (甄峰)  [email protected]   Camera的可設定項極多,V4L2 支援了不少。但Sam之前對這些設定的用法和涵義

從RGB 到 HSV 的轉換詳細介紹

從RGB 到 HSV 的轉換詳細介紹1.RGB       RGB是從顏色發光的原理來設計定的,通俗點說它的顏色混合方式就好像有紅、綠、藍三盞燈,當它們的光相互疊合的時候,色彩相混,而亮度卻等於兩者亮度之總和,越混合亮度越高,即加法混合。        紅、綠、藍三個顏色通道

centos安裝配置hadoop超詳細過程

轉自:http://www.centoscn.com/image-text/install/2014/1121/4158.html 1、叢集部署介紹 1.1 Hadoop簡介           Hadoop是Apache軟體基金會旗下的一個開源分散式計算平臺。以Hadoop分散式檔案系統

java包名命名規範[

indi : 個體專案,指個人發起,但非自己獨自完成的專案,可公開或私有專案,copyright主要屬於發起者。 包名為“indi.發起者名.專案名.模組名.……”。 pers : 個人專案,指個人發起,獨自完成,可分享的專案,copyright主要屬於個人。 

SpringBoot入門詳細教程

網上有很多springboot的入門教程,自己也因為專案要使用springboot,所以利用業餘時間自學了下springboot和springcloud,使用下來發現springboot還是挺簡單的,體現了極簡的程式設計風格,大部分通用都是通過註解就可以完成,下面就來詳細

Java 位運 算 符

1. 算術運算子+ :加法- :減法* :乘法/ :除法% :取餘運算2. 關係運算符< :只能比較基本型別資料之間的關係,不能比較物件之間的關係。> : (同關係運算符“<”)<=: (同關係運算符“<”)>=: (同

程序(process)和執行緒(thread)圖文並茂很形象的講解

轉自 http://blog.jobbole.com/38696/ 程序(process)和執行緒(thread)是作業系統的基本概念,但是它們比較抽象,不容易掌握。 最近,我讀到一篇材料,發現有一個很好的類比,可以把它們解釋地清晰易懂。 1. 計算機的核心

Java集合框架的講解

下面要開始java中相關集合框架的學習啦。   Are you ready?Let's go~~   今天要講解的Java中的集合框架。   1) 首先檢視jdk中Collection類的原始碼後會發現如下內容:  &nbs

JAVA MemCache 史無前例詳細講解!看完包精通MEMCACHE

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

JAVA MemCache 史無前例詳細講解!看完包精通MEMCACHE!.

 Memcach什麼是Memcache Memcache叢集環境下快取解決方案 Memcache是一個高效能的分散式的記憶體物件快取系統,通過在記憶體裡維護一個統一的巨大的hash表,它能夠用來儲存各種格式的資料,包括影象、視訊、檔案以及資料庫檢索的結果等。簡單的說就是將資