Memcached 安裝使用存儲

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

pid.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末渠脉,一起剝皮案震驚了整個濱河市宇整,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芋膘,老刑警劉巖鳞青,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霸饲,死亡現(xiàn)場離奇詭異,居然都是意外死亡臂拓,警方通過查閱死者的電腦和手機(jī)厚脉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胶惰,“玉大人傻工,你說我怎么就攤上這事》踔停” “怎么了中捆?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坊饶。 經(jīng)常有香客問我泄伪,道長,這世上最難降的妖魔是什么匿级? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任蟋滴,我火速辦了婚禮,結(jié)果婚禮上痘绎,老公的妹妹穿的比我還像新娘津函。我一直安慰自己,他們只是感情好简逮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布球散。 她就那樣靜靜地躺著尿赚,像睡著了一般散庶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凌净,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天悲龟,我揣著相機(jī)與錄音,去河邊找鬼冰寻。 笑死须教,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斩芭。 我是一名探鬼主播轻腺,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼划乖!你這毒婦竟也來了贬养?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤琴庵,失蹤者是張志新(化名)和其女友劉穎误算,沒想到半個月后仰美,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡儿礼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年咖杂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚊夫。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡诉字,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出知纷,到底是詐尸還是另有隱情奏窑,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布屈扎,位于F島的核電站埃唯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鹰晨。R本人自食惡果不足惜墨叛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望模蜡。 院中可真熱鬧漠趁,春花似錦、人聲如沸忍疾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卤妒。三九已至甥绿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間则披,已是汗流浹背共缕。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留士复,地道東北人图谷。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像阱洪,于是被迫代替她去往敵國和親便贵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容