Memcached 涉及以下內(nèi)容
1,Memcached 基本概念
2,Memcached 安裝
3修噪,Memcached 基本命令
4,Memcached 原理
5路媚,stats 命令
6黄琼,stats items 數(shù)據(jù)項(xiàng)統(tǒng)計(jì)
7,stats settings 查看設(shè)置
8,stats slabs區(qū)塊統(tǒng)計(jì)
9脏款,Memcached的數(shù)據(jù)存儲過程
Memcached 是什么
Memcached 是一款開源的围苫,高性能的,分布式的內(nèi)存對象緩存系統(tǒng)撤师。
Memcached能干什么
最主要的功能就是:在內(nèi)存中緩存數(shù)據(jù),以減輕數(shù)據(jù)庫負(fù)載剂府。
它通過在內(nèi)存中緩存數(shù)據(jù)和對象來減少讀取數(shù)據(jù)庫的次數(shù),從而提高動態(tài)數(shù)據(jù)庫驅(qū)動網(wǎng)站的速度剃盾。
Memcached 特點(diǎn)
- 在內(nèi)存中以key/value 對存儲腺占,性能好。
- 協(xié)議簡單(基于文本行)痒谴,功能強(qiáng)大衰伯。
- 基于libevent的事件處理,無阻塞通信积蔚,對內(nèi)存讀寫數(shù)據(jù)非骋饩ǎ快。
- 基于客戶端的分布式尽爆,服務(wù)器多個Memcached之間不互相通信怎顾。
- 服務(wù)器端以守護(hù)進(jìn)程運(yùn)行,客戶端可以用任何語言來編寫漱贱。
安裝Memcached服務(wù)器端
1. 需要安裝libevent.
- libevent是個程序庫,它將Linux的epoll槐雾、BSD類操作系統(tǒng)的kqueue等事件 處理功能封裝成統(tǒng)一的接口,具有很高的性能。
下載 wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz
解壓 tar vxf libevent-2.1.8-stable.tar.gz
.configure --prefix=/usr/common/libevent
make & make install
2. 安裝Memcached.
下載 wget http://www.memcached.org/files/memcached-1.4.37.tar.gz
解壓 tar vxf memcached-1.4.37.tar.gz
./configure --prefix=/usr/common/memcached --with-libevent=/usr/common/libevent/
make & make install
Memcached 基本命令
啟動服務(wù)器端
cd /usr/common/memcached
./memcached -d -m 100 -u root -l 71.0.0.29 -p 2223 -c 256 -P /usr/pid/memcached.pid
-d 選項(xiàng)是啟動一個守護(hù)進(jìn)程 幅狮。
-m 是分配給Memcache使用的內(nèi)存數(shù)量,單位是MB,這里是100MB 蚜退。
-u 是運(yùn)行Memcache的用戶,這里是root 。
-l 是監(jiān)聽的服務(wù)器IP地址,這里指定了服務(wù)器的IP地址71.0.0.29彪笼。
-p 是監(jiān)聽的端口,這里設(shè)置了2223,最好是1024以上的端口 钻注。
-c 選項(xiàng)是最大運(yùn)行的并發(fā)連接數(shù),默認(rèn)是1024,這里設(shè)置了256 。
-P 是設(shè)置保存Memcache的pid文件,這里是保存在 /usr/pid/memcached.pid配猫。
常用的還有幾個需要了解:
-f 塊大小增長因子,默認(rèn)是1.25幅恋。
-n 最小分配空間, key+value+flags 默認(rèn)是 65byte。
-I 每個slab page的大小泵肄。
-v/-vv 詳細(xì)顯示工作時各種參數(shù)捆交。
關(guān)閉Memcached
ps aux|grep memcached
kill pid
Memcached的基本原理
Memcached的基本的工作原理
Memcached 是以守候程序的方式運(yùn)行與一個或者多個服務(wù)器,
隨時等待客戶端的鏈接腐巢。通過啟動Memcached服務(wù)器端品追,配置相應(yīng)的監(jiān)聽
IP,端口內(nèi)存大小等參數(shù),客戶端通過制定的服務(wù)器端IP冯丙,將數(shù)據(jù)以key/value的方式存儲肉瓦。
Memcached 的兩階段哈希
客戶端存取數(shù)據(jù)時,首先參考節(jié)點(diǎn)列表計(jì)算出key的哈希值(階段一 哈希),
進(jìn)而選中一個節(jié)點(diǎn)泞莉;客戶端將請求發(fā)送給選中的節(jié)點(diǎn)哪雕,然后Memcached節(jié)點(diǎn)通過
一個內(nèi)部的哈希算法(階段二哈希),進(jìn)行真正的數(shù)據(jù)(item)存取鲫趁。
Memcached 的服務(wù)器客戶端通信并不適用復(fù)雜的xml等格式斯嚎,而使用簡單的基于
文本行的協(xié)議。因此挨厚,通過telnet 也能在Memcached 上保存堡僻,取得數(shù)據(jù)。
Memcached的操作命令
- 命令行連接 Memcached
telnet 71.0.0.29 2223
- 標(biāo)準(zhǔn)協(xié)議:Memcached所有的標(biāo)準(zhǔn)協(xié)議包含在item執(zhí)行命令過程中疫剃,一個item包含兩行:
第一行:Key flags expirationTime Bytes
Key:Key 用于查找緩存值 钉疫。
Flags:一個32位的標(biāo)志值,客戶機(jī)使用它存儲關(guān)于鍵值對的額外信息 。
Expirationtime:在緩存中保存鍵值對的時長(以秒為單位,0表示永遠(yuǎn)) 慌申。
Bytes:在緩存中存儲的字節(jié)數(shù)陌选。
第二行:Value:存儲的值(始終位于第二行)
noreply:可以在命令的第一行后面加入noreply,以避免在處理交互命令的時候,等待服
務(wù)端的返回
向Memcached寫入值
常用命令有:set理郑、add蹄溉、replace、append您炉、prepend柒爵、cas,delete
1:set:用于向緩存添加新的鍵值對,如果鍵已經(jīng)存在,則之前的值將被替換赚爵。
2:add:僅當(dāng)緩存中不存在鍵時,add命令才會向緩存中添加一個鍵值對,如果緩存中已經(jīng)存
在鍵,則之前的值將仍然保持,服務(wù)器響應(yīng) NOT_STORED棉胀。3:replace:僅當(dāng)鍵已經(jīng)存在時,replace命令才會替換緩存中的鍵。如果緩存中不存在鍵,
服務(wù)器響應(yīng)NOT_STORED冀膝。4:append:是在現(xiàn)有緩存數(shù)據(jù)后面新增數(shù)據(jù)唁奢。如果key不存在,服務(wù)器響應(yīng) NOT_STORED。
5:prepend:是在現(xiàn)有緩存數(shù)據(jù)前面新增數(shù)據(jù)窝剖。如果key不存在,服務(wù)器響應(yīng) NOT_STORED麻掸。
6:cas(Check And Set ):檢查和更新,只有從你讀取數(shù)據(jù)后,別人沒有更新這 個數(shù)據(jù),才能夠正確保存。就是版本控制,通常和gets配合使用赐纱。
獲取數(shù)據(jù)的命令有:get 脊奋、 gets get用來獲取數(shù)據(jù),gets獲取的是數(shù)據(jù)+版本號。7: 刪除數(shù)據(jù)的命令:delete疙描。
set k1 0 0 5
lihao
STORED
add s2 0 0 5
lihao
STORED
命令stats
stats命令:查詢服務(wù)器的運(yùn)行狀態(tài)和其他內(nèi)部數(shù)據(jù)诚隙。
- pid :服務(wù)器進(jìn)程 ID。
- uptime :服務(wù)器運(yùn)行時間,單位秒起胰。
- time:服務(wù)器當(dāng)前的 UNIX 時間 久又。
- version :服務(wù)器的版本號 5:libevent:libevent的版本。
- pointer_size :服務(wù)器操作系統(tǒng)位數(shù)。
- rusage_user:該進(jìn)程累計(jì)的用戶時間
- rusage_system:該進(jìn)程累計(jì)的系統(tǒng)時間
- curr_connections : 當(dāng)前連接數(shù)
- total_connections :服務(wù)器啟動后總連接數(shù)
- connection_structures :服務(wù)器分配的連接結(jié)構(gòu)的數(shù)量籽孙。
- reserved_fds:內(nèi)部使用的miscfds 數(shù)量烈评。
- cmd_get :獲取請求數(shù)量
- get_hits :獲取成功的總次數(shù),命中次數(shù)
- get_misses :獲取失敗的總次數(shù)
- cmd_set :存儲請求數(shù)量
- delete_misses :刪除失敗次數(shù)
- delete_hits :刪除命中
- bytes :已用緩存空間
- bytes_read :總共獲取的數(shù)據(jù)量
- bytes_written :總寫入數(shù)量數(shù)
- limit_maxbytes :總允許寫入的數(shù)據(jù)量,和分配的內(nèi)存有關(guān)
- accepting_conns:允許的總連接數(shù)
- curr_items: 當(dāng)前緩存 item 數(shù)量
- total_items :從服務(wù)啟動后,總的存儲緩存 item 數(shù)量
- evictions :通過刪除 item 釋放內(nèi)存的次數(shù)
這些數(shù)據(jù)隱含的幾個基本關(guān)系:
1,緩存命中率 = get_hits/cmd_get * 100%
2, get_misses的數(shù)字加上get_hits應(yīng)該等于cmd_get犯建。
3讲冠,flush_all命令:使內(nèi)存中所有的item失效。加入?yún)?shù)則表示在N秒后失效适瓦。這個操作并不
會真的釋放內(nèi)存空間,而是標(biāo)志所有的item為失效竿开。
4,version 命令 : 查看版本玻熙。
stats settings 查看設(shè)置
- maxbytes:最大字節(jié)數(shù)限制,0無限制
- maxconns:允許最大連接數(shù)
- growth_factor:增長因子
- chunk_size:key+value+flags大小
- reqs_per_event: 最大IO吞吐量(每event)
stats items 數(shù)據(jù)項(xiàng)統(tǒng)計(jì)
- number: 該slab中對象數(shù)否彩,不包含過期對象。
- age:LRU隊(duì)列中最老對象的過期時間.
- evicted: LRU釋放對象數(shù).
- evicted_nonzero: 設(shè)置了非0時間的LRU釋放對象數(shù)嗦随。
- evicted_time: 最后一次LRU秒數(shù),監(jiān)控頻率列荔。
stats slabs區(qū)塊統(tǒng)計(jì)
- chunk_size: chunk大小,byte
- chunks_per_page: 每個page的chunk數(shù)量
- total_pages : page數(shù)量
- total_chunks: chunk數(shù)量*page數(shù)量
- get_hits: 命中數(shù)枚尼。
- used_chunks: 已被分配的chunk數(shù)
- free_chunks:剩余chunk數(shù)
- total_chunks: 總chunk數(shù) used_chunks+free_chunks
- mem_requested: 請求存儲的字節(jié)數(shù)贴浙。
- active_slabs:slab數(shù)量。
- total_malloced:總內(nèi)存數(shù)量署恍。
被浪費(fèi)內(nèi)存數(shù)=((total_chunks或者used_chunks) * chunk_size) - mem_requested,如 果太大,需要調(diào)整factor崎溃。
Memcached的數(shù)據(jù)存儲
Memcached的數(shù)據(jù)存儲方式被稱為Slab Allocator,其基本方式是:
1:先把內(nèi)存分成很多個Slab,這個大小是預(yù)先規(guī)定好的,以解決內(nèi)存碎片的問題。
分配給Slab的內(nèi)存空間被稱為Page,默認(rèn)是1M盯质。一個Slab下可以有多個Page袁串。
2:然后把一個Page分成很多個chunk塊,chunk塊是用于緩存記錄的空間。Chunk的
大小是先有一個基本值,然后根據(jù)增長因子來增大呼巷。
3:slab class:內(nèi)存區(qū)類別(48byte-1M),每個類別有一個slab classId
4:Memcached里面保存著slab內(nèi)空閑的chunk列表,當(dāng)收到要保存的item的時候,它
會根據(jù)item的大小,去選擇一個最合適的slab,然后找到空閑的chunk,把數(shù)據(jù) 存放進(jìn)去囱修。
新建Item分配內(nèi)存過程
1:快速定位slab classid,先計(jì)算Item長度
key鍵長 + flag長度+value值長+65
如果>1MB,無法存儲丟棄王悍。
取最小冗余的slab class
如:有48,96,120,存90會選擇96
2:按順序?qū)ふ铱捎胏hunk
(1)slot:檢查slab回收空間slot里是否有剩余chunk
delete:delete時標(biāo)記到slot
exptime:get時檢查的過期對象標(biāo)記到slot
(2)end_page_ptr:檢查page中是否有剩余chunk
(3)memory:內(nèi)存還有剩余空間可以用于開辟新的slab
(4)LRU
Memcached的數(shù)據(jù)存儲方式的缺點(diǎn):
由于chunk的大小是預(yù)先分配好的特定長度,因此如果數(shù)據(jù)不能完全填滿
chunk,那么剩余的空間就浪費(fèi)了破镰。
Lazy Expiration(延遲/惰性 過期)
Memcached不會監(jiān)控記錄是否過期,而是在外部來獲取數(shù)據(jù)的時候,才檢查
記錄的時間戳,因此稱為Lazy Expiration。
LRU(Least Recently Used 最近最少使用)
當(dāng)空間不足的時候,Memcached會優(yōu)先使用已經(jīng)過期的數(shù)據(jù)空間,如果還不
夠,那么就會把最近最少使用的對象的空間釋放出來使用配名。
懶惰刪除機(jī)制
刪除item對象時,不釋放內(nèi)存,作刪除標(biāo)記,指針放入slot回收插槽,下
次分配的時候直接使用啤咽。
要特別注意:Memcached的LRU不是全局的,而是針對slab的,可以說是區(qū)域性的。
相關(guān)文章
Memcached 安裝使用存儲
http://www.reibang.com/p/2b3c43c1778c
java 使用memcached以及spring 配置memcached
http://www.reibang.com/p/6f264bf5d9f9
memcached優(yōu)化
http://www.reibang.com/p/789d208036f5