Memcached介紹及簡單的使用
1???????Memcached介紹

1.1?????概述
Memcached是一個開源的高性能的分布式內存對象緩存系統,在Web應用中用于減輕數據庫負載。我們可以將使用頻率較高,且要求時效性不嚴格的數據緩存到memcached中,以減少讀取數據庫的次數,從而減低數據庫壓力。另外,在集群環境下,也可以通過memcached緩存session,以達到session數據共享的目的。
1.2?????特點
memcached作為高速運行的分布式緩存服務器,具有以下的特點。
· 協議簡單
· 基于libevent的事件處理
· 內置內存存儲方式
· memcached不互相通信的分布式
Memcached是否支持數據持久化?
沒有,memcached不具備數據持久化功能,當memcached重啟時,保存在里面的數據會全部丟失;
Memcached的各節點是否能夠進行數據同步共享?
不能,memcached的各節點是相互獨立的,無法共享數據;
Memcached是否會產生內存碎片?
不會,memcached使用SlabAllocation的內存預分配機制,不會產生內存碎片。
正是因為以上幾點,memcached的CPU使用率是非常低的,所以如果服務器上有空閑的內存,不妨利用起來,作為緩存使用。
1.3?????原理
1)???? 數據存儲方式-Slab Allocation機制
名詞解釋:
Chunk:用于緩存記錄的內存空間。
Page:分配給Slab的內存空間,默認是1MB。分配給Slab之后根據切分成大小相同的chunk。
Slab Class:特定大小的chunk的組。
Growth Factor:增長因數,默認為1.25
Memcached在啟動時,會根據配置的起始chunk大小、增長因子Growth Factor、page的大小,生成Slab。例如chunk size是88B,page為1M,Growth Factor是1.25,則會生成88、112、144、184……1M等39組Slab。每個slab保存固定尺寸的chunk,由此不難發現,slab的chunk越大,其中的每個page包含的chunk數量就越少。
圖1 Slab Allocation的構造圖
當有新的對象放入memcached時,memcached會根據對象的大小匹配到對應的slab上,比如100KB的對象,根據最小空間損失原則,會被放入到slab2(size:112B)對應的page下,如下圖
圖2選擇存儲記錄的組的方法
綜上,不難發現SlabAllocation存儲方式的缺點:
A.?? 啟動時直接生成了slabs,如果在實際應用中沒有被使用,則會造成內存浪費
B.??由于分割成特定長度的chunck,因此保證有效的內存利用。例如,將100字節的數據緩存到128字節的chunk里,將會造成28字節的內存浪費
2???????Memcached安裝
2.1??準備工作
下載memcached與libevent的安裝文件
http://memcached.googlecode.com/files/memcached-1.4.16.tar.gz(memcached-)
https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz(libevent-)
2.2??具體安裝步驟
1)???????由于memcached依賴于libevent,因此需要安裝libevent。由于linux系統可能默認已經安裝libevent,執行命令:
rpm -qa|grep libevent
查看系統是否帶有該安裝軟件,如果有執行命令:
rpm -e libevent-1.4.13-4.el6.x86_64--nodeps(由于系統自帶的版本舊,忽略依賴刪除)
2)???????安裝libevent命令:
tar zxvf libevent-2.0.21-stable.tar.gz
cdlibevent-2.0.21-stable
./configure--prefix=/usr/local/libevent
make
make install
至此libevent安裝完畢;測試libevent是否安裝成功:
3)???????安裝memcached命令:
tar zxvf memcached-1.4.2.tar.gz
cd memcached-memcached-1.4.2
./configure--prefix=/usr/local/memcached--with-libevent=/usr/local/libevent/
make
make install
至此memcached安裝完畢;測試是否成功安裝memcached:
[root@linux memcached]# ls -al /usr/local/bin/mem*
-rwxr-xr-x 1 root root 245919 12-10 19:03/usr/local/bin/memcached
4)???????啟動memcached
/usr/local/memcached/bin/memcached -d -m256 -u root -p 11211 -c 1024 –P /tmp/memcached.pid
啟動參數說明:
-d 選項是啟動一個守護進程。
-u root 表示啟動memcached的用戶為root。
-m 是分配給Memcache使用的內存數量,單位是MB,默認64MB。
-M return error on memory exhausted(rather than removing items)。
-u 是運行Memcache的用戶,如果當前為root 的話,需要使用此參數指定用戶。
-l 是監聽的服務器IP地址,默認為所有網卡。
-p 是設置Memcache的TCP監聽的端口,最好是1024以上的端口。
-c 選項是最大運行的并發連接數,默認是1024。
-P 是設置保存Memcache的pid文件。
-f
-I Override the size ofeach slab page. Adjusts max item size(1.4.2版本新增)。? 也可以啟動多個守護進程,但是端口不能重復
查看進程
[root@linuxmemcached]# ps aux | grep memcached
5)???????停止memcached
找到進程號,直接kill掉
6)???????可能存在的錯誤以及解決方案
如果出現客戶端連接不上memcached的情況,請將防火墻關閉或將防火墻中的memcached端口(11211端口)打開。
開啟對外訪問的網絡端口(以11211為例):
iptables -A INPUT-p tcp --dport 11211 -j ACCEPT
iptables -A OUTPUT-p tcp --sport 11211 -j ACCEPT #開啟11211端口
service iptablessave #保存配置
/etc/rc.d/init.d/iptablesrestart #重啟服務
查看端口是否開放
/etc/init.d/iptablesstatus 或/e
注意:make的時候報錯
memcached.c: 在函數‘add_iov’中:
memcached.c:696:30: 錯誤: ‘IOV_MAX’未聲明(在此函數內第一次使用)
memcached.c:696:30: 附注: 每個未聲明的標識符在其出現的函數內只報告一次
make[2]: *** [memcached-memcached.o] 錯誤 1
需要修改 memcached.c 文件:
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */
#ifndef IOV_MAX
#if defined(__FreeBSD__) || defined(__APPLE__)
# define IOV_MAX 1024
#endif
#endif
改成:
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */
#ifndef IOV_MAX
# define IOV_MAX 1024
#endif
再make&&make install,編譯之后退出root用戶。tc/init.d/iptables –Ln
3 Memcached使用
3.1??命令模式下
memcached 查看方法
格式: telnet ip port
例如 telnet localhost 11211
退出命令:quit
存儲命令格式:
參數說明:
1).set??無論如何都存儲,數據不存在時存儲,數據存在時更新。
set?mykey?0?0?3 123 STORED set?mykey?0?0?3 456 STORED
2).add?當數據不存在時存儲。
add?mykey?0?0?3 123 STORED add?mykey?0?0?3 456 NOT_STORED
3).replace?當數據存在時存儲
set?mykey?0?0?3 123 STORED replace?mykey?0?0?3 456 STORED delete?mykey DELETED replace?mykey?0?0?3 678 NOT_STORED
讀取命令
1).get?key 可以一個或多個,用空格格開。
set?mykey?0?0?3 123 STORED set?mykey1?0?0?3 456 STORED get?mykey?mykey1 VALUE?mykey?0?3 123 VALUE?mykey1?0?3 456 END
2).gets?與 get 一樣,但會返回多一個數字,這個數字用來檢查數據是否被修改過,如修改過,這個數字回改變
set?mykey?0?0?3 123 STORED gets?mykey VALUE?mykey?0?3?7 123 END replace?mykey?0?0?3 888 STORED gets?mykey VALUE?mykey?0?3?8 888 END
3).cas?cas即checked and set?,當最后一個參數與gets返回的數字一致時才存儲,否則返回EXISTS。
set?mykey?0?0?3 123 STORED gets?mykey VALUE?mykey?0?3?9 123 END cas?mykey?0?0?3?8 456 EXISTS cas?mykey?0?0?3?9 456 STORED
追加與清除命令
1).append?將數據追加到當前緩存數據的之后,當緩存數據存在時才存儲。
set?mykey?0?0?3 123 STORED append?mykey?0?0?3 456 STORED get?mykey VALUE?mykey?0?6 123456 END append?notexists?0?0?3 456 NOT_STORED
2).prepend?將數據追加到當前緩存數據的之前,當緩存數據存在時才存儲。
set?mykey?0?0?3 123 STORED prepend?mykey?0?0?3 456 STORED get?mykey VALUE?mykey?0?6 456123 END prepend?notexists?0?0?3 456 NOT_STORED
3).delete?刪除緩存數據,數據存在返回DELETED,數據不存在返回NOT_FOUND
set?mykey?0?0?3 123 STORED delete?mykey DELETED delete?mykey NOT_FOUND
4).flush_all?將當前所有緩存數據設置為過期,但不會釋放內存。
flush_all OK
狀態命令
1).stats?查看memcached運行狀態
pid?????????????????????Memcached?進程ID?? ?? uptime??????????????????Memcached?運行時間,單位:秒?? ?? time????????????????????Memcached?當前的UNIX時間?? ?? version?????????????????Memcached?的版本號?? ?? rusage_user?????????????該進程累計的用戶時間,單位:秒?? ?? rusage_system???????????該進程累計的系統時間,單位:秒?? ?? curr_items??????????????Memcached?當前存儲的內容數量?? ?? total_items?????????????Memcached?啟動以來存儲過的內容總數?? ?? bytes???????????????????Memcached?當前存儲內容所占用的字節數(*/1024/1024=mb)?? ?? curr_connections????????當前連接數量?? ?? total_connections???????Memcached?運行以來接受的連接總數?? ?? connection_structures???Memcached?分配的連接結構的數量?? ?? cmd_get?????????????????查詢請求總數?? ?? cmd_set?????????????????存儲(添加/更新)請求總數?? ?? get_hits????????????????查詢成功獲取數據的總次數?? ?? get_misses??????????????查詢成功未獲取到數據的總次數?? ?? bytes_read??????????????Memcached?從網絡讀取到的總字節數?? ?? bytes_written???????????Memcached?向網絡發送的總字節數?? ?? limit_maxbytes??????????Memcached?在存儲時被允許使用的字節總數
2).stats items
執行stats items,可以看到STAT items行,如果memcached存儲內容很多,那么這里也會列出很多的STAT items行。
3).stats cachedump slabs_id limit_num
slabs_id:由stats items返回的結果(STAT items后面的數字)決定的
limit_num:返回的記錄數,0表示返回所有記錄
通過stats items、stats cachedump slab_id limit_num配合get命令可以遍歷memcached的記錄。
stats?cachedump?1?0 ITEM?mykey?[3?b;?1362880145?s] END
4).stats slabs?顯示各個slab的信息,包括chunk的大小、數目、使用情況等
5).stats sizes?輸出所有item的大小和個數
6).stats reset?清空統計數據
3.2??Java代碼中
1.1. 3.2.1配置XMemcached客戶端的jar包
xmemcached-1.2.3.jar
3.2.2 java代碼段舉例
MemcachedClientBuilder?builder?=?new?XMemcachedClientBuilder(AddrUtil.getAddresses("192.168.4.151:11211"));//通過連接地址及端口獲取builder對象MemcachedClient?memcachedClient?=?null;try?{ ?????memcachedClient?=?builder.build(); ?????memcachedClient.set("key",?0,?“value”);//?設置鍵為key的內容,0代表生存周期為無限 ?????Object?obj?=?memcachedClient.get("key");//獲取鍵為key的內容 ?????memcachedClient.delete("key");//刪除鍵為key的內容}?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)?{ ???e.printStackTrace(); }?catch?(IOException?e)?{ ???e.printStackTrace(); }try?{ ????memcachedClient.shutdown(); }?catch?(IOException?e)?{ ????System.err.println("Shutdown?MemcachedClient?fail"); ????e.printStackTrace(); }
附:
以上內容相關的安裝包及jar如下:
http://download.csdn.net/detail/keyingbo2008/6943287
xme
Memcached 緩存 存儲
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。