黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Memcahce(MC)系列(一)Memcache介紹、使用、

系統(tǒng) 2569 0

寫(xiě)在前面: 前不久在工作中被問(wèn)到關(guān)于MC一致哈希的問(wèn)題,由于時(shí)隔太久差點(diǎn)兒忘記,特前來(lái)惡補(bǔ)一下MC,下面是前幾年在工作中學(xué)習(xí)MC時(shí)的一些資料,來(lái)歷不明,特整理一下,希望對(duì)大家的學(xué)習(xí)也能有幫助。

關(guān)于memcache的安裝,有興趣的朋友請(qǐng)參考這篇文章: http://blog.csdn.net/xifeijian/article/details/22000173

1、memcached 介紹

1.1 memcached 是什么?

memcached 是以LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 為首開(kāi)發(fā)的一款軟件。如今已成為mixi、hatena、Facebook、Vox、LiveJournal 等眾多服務(wù)中提高Web

應(yīng)用擴(kuò)展性的重要因素。很多Web 應(yīng)用都將數(shù)據(jù)保存到RDBMS 中,應(yīng)用server從中讀取數(shù)據(jù)并在瀏覽器中顯示。但隨著數(shù)據(jù)量的增大、訪問(wèn)的集中,就會(huì)出現(xiàn)RDBMS 的負(fù)擔(dān)加重、數(shù)據(jù)庫(kù)響應(yīng)惡化、站點(diǎn)顯示延遲等重大影響。這時(shí)就該memcached 大顯身手了。memcached 是高性能的分布式內(nèi)存緩存server。一般的使用目的是,通過(guò)緩存數(shù)據(jù)庫(kù)查詢(xún)結(jié)果,降低數(shù)據(jù)庫(kù)訪問(wèn)次數(shù),以提高動(dòng)態(tài)Web 應(yīng)用的速度、提高可擴(kuò)展性。

Memcahce(MC)系列(一)Memcache介紹、使用、存儲(chǔ)、算法、優(yōu)化

內(nèi)置內(nèi)存存儲(chǔ)方式

為了提高性能,memcached 中保存的數(shù)據(jù)都存儲(chǔ)在memcached 內(nèi)置的內(nèi)存存儲(chǔ)空間中。由于數(shù)據(jù)僅存在于內(nèi)存中,因此重新啟動(dòng)memcached、重新啟動(dòng)操作系統(tǒng)會(huì)導(dǎo)致全部數(shù)據(jù)消失。另外,內(nèi)容容量達(dá)到指定值之后,就基于LRU(Least Recently Used)算法自己主動(dòng)刪除不使用的緩存。memcached 本身是為緩存而設(shè)計(jì)的server,因此并沒(méi)有過(guò)多考慮數(shù)據(jù)的永久性問(wèn)題

memcached 不互相通信的分布式

memcached 盡管是 分布式 緩存server,但server端并沒(méi)有分布式功能。各個(gè)

memcached 不會(huì)互相通信以共享信息。那么,如何進(jìn)行分布式呢?這全然取決于client的實(shí)現(xiàn)。

Memcahce(MC)系列(一)Memcache介紹、使用、存儲(chǔ)、算法、優(yōu)化

2.2 memcached 啟動(dòng)

memcached 啟動(dòng)的命令在安裝文件夾的bin 二級(jí)文件夾下,如/home/test/app/memcahced-1.4.2/bin/memcached -p 11222 -m 128 d

經(jīng)常使用的一些啟動(dòng)選項(xiàng)介紹選項(xiàng)說(shuō)明

-p 偵聽(tīng)的端口,默覺(jué)得11211

-m 使用內(nèi)存大小,默認(rèn)的64m

-d 作為daemon 在后臺(tái)啟動(dòng)

-vv 用very vrebose 模式啟動(dòng),調(diào)試信息和錯(cuò)誤輸出到控制臺(tái)

-l 偵聽(tīng)的地址,默覺(jué)得全部能夠訪問(wèn)的地址

-M 用于在內(nèi)存溢出的時(shí)候,返回一個(gè)錯(cuò)誤,禁止自己主動(dòng)的移出數(shù)

據(jù),替代的是返回一個(gè)error

-P Pid 文件存在的路徑,僅限加上-d 參數(shù)是用

-c 最大同一時(shí)候的連接數(shù),默覺(jué)得1024

其它的一些選項(xiàng),能夠通過(guò) h 命令來(lái)進(jìn)行查看

2.3 命令行訪問(wèn) memcached

下面假設(shè)memcached 啟動(dòng)時(shí)的-p 參數(shù)為11311,命令操作在啟動(dòng)memcached

本機(jī)首先telnet 連接到memcached server

telnet 127.0.0.1 11311

telnet 成功之后,大概會(huì)顯示下面的信息

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

?

各種狀態(tài)( stats

STAT <name> <value>\r\n

如:stats 命令,則返回下面信息:

stats
STAT pid 26804
STAT uptime 182783
STAT time 1404973716
STAT version 1.4.13
STAT libevent 2.0.11-stable
STAT pointer_size 64
STAT rusage_user 2.320647
STAT rusage_system 5.411177
STAT curr_connections 34
STAT total_connections 558
STAT connection_structures 37
STAT reserved_fds 20
STAT cmd_get 127292
STAT cmd_set 60056
STAT cmd_flush 145
STAT cmd_touch 0
STAT get_hits 83811
STAT get_misses 43481
STAT delete_misses 15970
STAT delete_hits 11992
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 14300156
STAT bytes_written 11507140
STAT limit_maxbytes 134217728 ? ??? # ?分配給memcache的內(nèi)存大小(字節(jié))
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT expired_unfetched 16884
STAT evicted_unfetched 0
STAT bytes 609350 ?? ?# 當(dāng)前server存儲(chǔ)items占用的字節(jié)數(shù)
STAT curr_items 4668 ??? # server當(dāng)前存儲(chǔ)的items數(shù)量
STAT total_items 60056
STAT evictions 0 ? ?? # 分配給memcache的空間用滿后須要?jiǎng)h除舊的items數(shù),踢出。
STAT reclaimed 27160 ?#回收再利用,已過(guò)期的數(shù)據(jù)條目來(lái)存儲(chǔ)新數(shù)據(jù)。
END

?

存儲(chǔ)命令( set ,add ,replace

client會(huì)發(fā)送一行像這樣的命令:

<command name> <key> <flags> <exptime> <bytes>\r\n

如:

set key1 0 600 5\r\nvalue\r\n

add key2 0 500 2\r\n

replace key1 0 600 6\r\nvalue1\r\n

具體的命令說(shuō)明,能夠見(jiàn)附錄的memcached 中英文協(xié)議內(nèi)容

?

讀取命令(get

命令例如以下:get <key>*\r\n

- <key>* 表示一個(gè)或多個(gè)鍵值,由空格隔開(kāi)的字串

如:

get key1

VALUE key1 0 7

value12

?

刪除命令( delete

命令如:delete <key> <time>\r\n

<key> 是client希望server刪除的內(nèi)容的鍵名

- <time> 是一個(gè)單位為秒的時(shí)間(或代表直到某一刻的Unix 時(shí)間),在該時(shí)間內(nèi)server會(huì)拒絕對(duì)于此鍵名的 add replace 命令。此時(shí)內(nèi)容被放入delete 隊(duì)列,無(wú)法再通過(guò) get 得到該內(nèi)容,也無(wú)法是用 add replace 命令(可是 set 命令可用)。直到指定時(shí)間,這些內(nèi)容被終于從server的內(nèi)存中徹底清除

<time> 參數(shù)是可選的,缺省為0 (表示內(nèi)容會(huì)立馬清除,并且隨后的存儲(chǔ)命令均可用

如:delete key1

退出命令 (quit)

如: quit

4、理解memcached 的內(nèi)存存儲(chǔ)

4.1Slab Allocation 機(jī)制:整理內(nèi)存以便反復(fù)使用

近期的memcached 默認(rèn)情況下採(cǎi)用了名為Slab Allocator 的機(jī)制分配、管理內(nèi)存。在該機(jī)制出現(xiàn)以前,內(nèi)存的分配是通過(guò)對(duì)全部記錄簡(jiǎn)單地進(jìn)行malloc和free 來(lái)進(jìn)行的??墒牵@樣的方式會(huì)導(dǎo)致內(nèi)存碎片,加重操作系統(tǒng)內(nèi)存管理器的負(fù)擔(dān),最壞的情況下,會(huì)導(dǎo)致操作系統(tǒng)比memcached 進(jìn)程本身還慢。 Slab Allocator 就是為解決該問(wèn)題而誕生的

Slab Allocation 的原理相當(dāng)簡(jiǎn)單。將分配的內(nèi)存切割成各種尺寸的塊

(chunk),并把尺寸同樣的塊分成組(chunk 的集合)

Memcahce(MC)系列(一)Memcache介紹、使用、存儲(chǔ)、算法、優(yōu)化

并且, slab allocator 還有反復(fù)使用已分配的內(nèi)存的目的。 也就是說(shuō), 分配到的內(nèi)存不會(huì)釋放,而是反復(fù)利用。

Slab Allocation 的主要術(shù)語(yǔ)

Page

分配給Slab 的內(nèi)存空間,默認(rèn)是1MB。 分配給Slab 之后依據(jù)slab 的大小切分成chunk 。

Chunk

用于緩存記錄的內(nèi)存空間。

Slab Class

特定大小的chunk 的組

4.2 Slab 中緩存記錄的原理

memcached 依據(jù)收到的數(shù)據(jù)的大小,選擇最適合數(shù)據(jù)大小的slab,memcached 中保存著slab 內(nèi)空暇chunk 的列表,依據(jù)該列表選擇chunk,然

后將數(shù)據(jù)緩存于當(dāng)中

Memcahce(MC)系列(一)Memcache介紹、使用、存儲(chǔ)、算法、優(yōu)化

4.3 Slab Allocator 的缺點(diǎn)

由于分配的是特定長(zhǎng)度的內(nèi)存,因此無(wú)法有效利用分配的內(nèi)存。比如,將100 字節(jié)的數(shù)據(jù)緩存到128 字節(jié)的chunk 中,剩余的28字節(jié)就浪費(fèi)了

Memcahce(MC)系列(一)Memcache介紹、使用、存儲(chǔ)、算法、優(yōu)化

對(duì)于該問(wèn)題眼下還沒(méi)有完美的解決方式,但在文檔中記載了比較有效的解決方式。就是說(shuō),假設(shè)預(yù)先知道client發(fā)送的數(shù)據(jù)的公用大小,或者僅緩存大小同樣的數(shù)據(jù)的情況下,僅僅要使用適合數(shù)據(jù)大小的組的列表,就能夠降低浪費(fèi)??墒欠浅_z憾,如今還不能進(jìn)行不論什么調(diào)優(yōu),僅僅能期待以后的版本號(hào)了??墒牵覀兡軌蛘{(diào)節(jié)slab class 的大小的區(qū)別。接下來(lái)說(shuō)明growth factor 選項(xiàng)。

?

4.4 使用 Growth Factor 進(jìn)行調(diào)優(yōu)

memcached 在啟動(dòng)時(shí)指定Growth Factor 因子(通過(guò)f 選項(xiàng)),就能夠在某種程度上控制slab 之間的差異。默認(rèn)值為1.25。 可是,在該選項(xiàng)出現(xiàn)之前,這個(gè)因子以前固定為2,稱(chēng)為 powers of 2 策略。

下面是啟動(dòng)后的verbose 輸出:

slab class 1: chunk size 128 perslab 8192

slab class 2: chunk size 256 perslab 4096

slab class 3: chunk size 512 perslab 2048

slab class 4: chunk size 1024 perslab 1024

slab class 5: chunk size 2048 perslab 512

slab class 6: chunk size 4096 perslab 256

slab class 7: chunk size 8192 perslab 128

slab class 8: chunk size 16384 perslab 64

slab class 9: chunk size 32768 perslab 32

slab class 10: chunk size 65536 perslab 16

slab class 11: chunk size 131072 perslab 8

slab class 12: chunk size 262144 perslab 4

slab class 13: chunk size 524288 perslab 2

可見(jiàn),從128 字節(jié)的組開(kāi)始,組的大小依次增大為原來(lái)的2 倍。這樣設(shè)置的問(wèn)題是,slab 之間的區(qū)別比較大,有些情況下就相當(dāng)浪費(fèi)內(nèi)存。因此,為盡量降低內(nèi)存浪費(fèi),兩年前追加了growth factor 這個(gè)選項(xiàng)來(lái)看看如今的默認(rèn)設(shè)置(f=1.25)時(shí)的輸出(篇幅所限,這里僅僅寫(xiě)到第10 組):

slab class 1: chunk size 88 perslab 11915

slab class 2: chunk size 112 perslab 9362

slab class 3: chunk size 144 perslab 7281

slab class 4: chunk size 184 perslab 5698

slab class 5: chunk size 232 perslab 4519

slab class 6: chunk size 296 perslab 3542

slab class 7: chunk size 376 perslab 2788

slab class 8: chunk size 472 perslab 2221

slab class 9: chunk size 592 perslab 1771

slab class 10: chunk size 744 perslab 1409

可見(jiàn),組間差距比因子為2 時(shí)小得多,更適合緩存幾百字節(jié)的記錄。從上面的輸出結(jié)果來(lái)看,可能會(huì)覺(jué)得有些計(jì)算誤差,這些誤差是為了保持字節(jié)數(shù)的對(duì)齊而有益設(shè)置的。將memcached 引入產(chǎn)品,或是直接使用默認(rèn)值進(jìn)行部署時(shí),最好是又一次計(jì)算一下數(shù)據(jù)的預(yù)期平均長(zhǎng)度,調(diào)整growth factor,以獲得最恰當(dāng)?shù)脑O(shè)置。內(nèi)存是珍貴的資源,浪費(fèi)就太可惜了。

5、memcached 刪除機(jī)制

memcached 是緩存,不須要永久的保存到server上,本章介紹memcache 的刪除機(jī)制

5.1 memcached 在數(shù)據(jù)刪除方面有效的利用資源

Memcached 不會(huì)釋放已經(jīng)分配的內(nèi)存,記錄過(guò)期之后,client無(wú)法再看到這一條記錄,其存儲(chǔ)空間就能夠利用。

Lazy Expiration

memcached 內(nèi)部不會(huì)監(jiān)視記錄是否過(guò)期,而是在get 時(shí)查看記錄的時(shí)間戳,檢查記錄是否過(guò)期。這樣的技術(shù)被稱(chēng)為lazy(惰性)expiration。因此,memcached不會(huì)在過(guò)期監(jiān)視上耗費(fèi)CPU 時(shí)間

5.2 LRU :從緩存中有效刪除數(shù)據(jù)的原理

memcached 會(huì)優(yōu)先使用已超時(shí)的記錄的空間,但即使如此,也會(huì)發(fā)生追加新記錄時(shí)空間不足的情況,此時(shí)就要使用名為L(zhǎng)east Recently Used(LRU)機(jī)制來(lái)分配空間。顧名思義,這是刪除 近期最少使用 的記錄的機(jī)制。因此,當(dāng)memcached 的內(nèi)存空間不足時(shí)(無(wú)法從slab class 獲取到新的空間時(shí)),就從近期未被使用的記錄中搜索,并將其空間分配給新的記錄。從緩存的有用角度來(lái)看,該模型十分理想。只是,有些情況下LRU 機(jī)制反倒會(huì)造成麻煩。memcached 啟動(dòng)時(shí)通過(guò) M 參數(shù)能夠禁止LRU,例如以下所看到的:

$ memcached -M m 1024

啟動(dòng)時(shí)必須注意的是,小寫(xiě)的 m 選項(xiàng)是用來(lái)指定最大內(nèi)存大小的。不指定具體數(shù)值則使用默認(rèn)值64MB。

指定 M 參數(shù)啟動(dòng)后,內(nèi)存用盡時(shí)memcached 會(huì)返回錯(cuò)誤。話說(shuō)回來(lái),memcached 畢竟不是存儲(chǔ)器,而是緩存,所以推薦使用LRU

6、memcached 的分布式算法

6.1memcached 的分布式

memcached 盡管稱(chēng)為 分布式 緩存server,但server端并沒(méi)有 分布式 功能。memcached 的分布式,則是全然由client程序庫(kù)實(shí)現(xiàn)的。這樣的分布式是memcached 的最大特點(diǎn)

memcached 的分布式是什么意思?

下面假設(shè)memcached server有node1~node3 三臺(tái),應(yīng)用程序要保存鍵名為 tokyo kanagawa 、 chiba saitama gunma 的數(shù)據(jù)

Memcahce(MC)系列(一)Memcache介紹、使用、存儲(chǔ)、算法、優(yōu)化

首先向memcached 中加入 tokyo 。將 tokyo 傳給client程序庫(kù)后,client實(shí)現(xiàn)的算法就會(huì)依據(jù) 來(lái)決定保存數(shù)據(jù)的memcached server。server選定后,即命令它保存 tokyo 及其值

同樣, kanagawa chiba saitama gunma 都是先選擇server再保接下來(lái)獲取保存的數(shù)據(jù)。獲取時(shí)也要將要獲取的鍵 tokyo 傳遞給函數(shù)庫(kù)。函數(shù)庫(kù)通過(guò)與數(shù)據(jù)保存時(shí)同樣的算法,依據(jù) 選擇server。使用的算法同樣,就能選中與保存時(shí)同樣的server,然后發(fā)送get 命令。僅僅要數(shù)據(jù)沒(méi)有由于某些原因被刪除,就能獲得保存的值。

這樣,將不同的鍵保存到不同的server上,就實(shí)現(xiàn)了memcached 的分布式。memcached server增多后,鍵就會(huì)分散,即使一臺(tái)memcached server發(fā)生問(wèn)題無(wú)法連接,也不會(huì)影響其它的緩存,系統(tǒng)依舊能繼續(xù)執(zhí)行

6.2 余數(shù)分布式算法

就是 依據(jù)server臺(tái)數(shù)的余數(shù)進(jìn)行分散 。求得鍵的整數(shù)哈希值,再除以server臺(tái)數(shù),依據(jù)其余數(shù)來(lái)選擇server

余數(shù)算法的缺點(diǎn)

余數(shù)計(jì)算的方法簡(jiǎn)單,數(shù)據(jù)的分散性也相當(dāng)優(yōu)秀,但也有其缺點(diǎn)。那就是當(dāng)加入或移除server時(shí),緩存重組的代價(jià)相當(dāng)巨大。加入server后,余數(shù)就會(huì)產(chǎn)生巨變,這樣就無(wú)法獲取與保存時(shí)同樣的server,從而影響緩存的命中。

6.3Consistent Hashing(一致哈希)

知識(shí)補(bǔ)充:哈希算法,即散列函數(shù)。將隨意長(zhǎng)度的二進(jìn)制值映射為較短的固定長(zhǎng)度的二進(jìn)制值,這個(gè)小的二進(jìn)制值稱(chēng)為哈希值。哈希值是一段數(shù)據(jù)唯一且極其緊湊的數(shù)值表示形式。假設(shè)散列一段明文并且哪怕僅僅更改該段落的一個(gè)字母,隨后的哈希都將產(chǎn)生不同的值。要找到散列為同一個(gè)值的兩個(gè)不同的輸入,在計(jì)算上是不可能的,所以數(shù)據(jù)的哈希值能夠檢驗(yàn)數(shù)據(jù)的完整性。一般用于高速查找和加密算法。(常見(jiàn)的有MD5,SHA-1)

Consistent Hashing 的簡(jiǎn)單說(shuō)明

Consistent Hashing 例如以下所看到的:首先求出memcached server(節(jié)點(diǎn))的哈希值(一般的方法能夠使用 cache 機(jī)器的 IP 地址或者機(jī)器名作為 hash 輸入。),并將其配置到0~ 2 32 的圓(continuum)上。然后用同樣的方法求出存儲(chǔ)數(shù)據(jù)的 的哈希值,并映射到圓上。然后從數(shù)據(jù)映射到的位置開(kāi)始順時(shí)針查找,將數(shù)據(jù)保存到找到的第一個(gè)server上。假設(shè)超過(guò) 2 32 仍然找不到server,就會(huì)保存到第一臺(tái)memcached server上。

Memcahce(MC)系列(一)Memcache介紹、使用、存儲(chǔ)、算法、優(yōu)化

從上圖的狀態(tài)中加入一臺(tái)memcached server。余數(shù)分布式算法由于保存鍵的server會(huì)發(fā)生巨大變化,而影響緩存的命中率,但Consistent Hashing中,僅僅有在continuum 上添加server的地點(diǎn)逆時(shí)針?lè)较虻牡谝慌_(tái)server上的鍵會(huì)受到影響

?Consistent hashing 的基本思想就是將對(duì)象和 cache 都映射到同一個(gè) hash 數(shù)值空間中,并且使用同樣的 hash 算法。

如今 cache 和對(duì)象都已經(jīng)通過(guò)同一個(gè) hash 算法映射到 hash 數(shù)值空間中了,接下來(lái)要考慮的就是如何將對(duì)象映射到 cache 上面了。

在這個(gè)環(huán)形空間中,假設(shè)沿著順時(shí)針?lè)较驈膶?duì)象的 key 值出發(fā),直到遇見(jiàn)一個(gè) cache ,那么就將該對(duì)象存儲(chǔ)在這個(gè) cache 上,由于對(duì)象和 cache 的 hash 值是固定的,因此這個(gè) cache 必定是唯一和確定的。這樣不就找到了對(duì)象和 cache 的映射方法了嗎?

Memcahce(MC)系列(一)Memcache介紹、使用、存儲(chǔ)、算法、優(yōu)化

Consistent Hashing :加入server

因此,Consistent Hashing 最大限度地抑制了鍵的又一次分布。并且,有的Consistent Hashing 的實(shí)現(xiàn)方法還採(cǎi)用了虛擬節(jié)點(diǎn)的思想。使用一般的hash函數(shù)的話,server的映射地點(diǎn)的分布非常不均勻。因此,使用虛擬節(jié)點(diǎn)的思想,為每一個(gè)物理節(jié)點(diǎn)(server)在continuum上分配100~200 個(gè)點(diǎn)。這樣就能抑制分布不均勻,最大限度地減小server增減時(shí)的緩存又一次分布。

通過(guò)上文中介紹的使用Consistent Hashing 算法的memcached client函數(shù)庫(kù)進(jìn)行測(cè)試的結(jié)果是,由server臺(tái)數(shù)(n)和添加的server臺(tái)數(shù)(m)計(jì)算添加server后的命中率計(jì)算公式例如以下:

(1 n/(n+m)) * 100


存儲(chǔ)命令

<command name> <key> <flags> <exptime> <bytes>\r\n

- <command name> 是set, add, 或者repalce

- <key> 是接下來(lái)的client所要求儲(chǔ)存的數(shù)據(jù)的鍵值

- <flags> 是在取回內(nèi)容時(shí),與數(shù)據(jù)和發(fā)送塊一同保存server上的隨意16 位無(wú)符號(hào)整形(用十進(jìn)制來(lái)書(shū)寫(xiě))。client能夠用它作為 位域 來(lái)存儲(chǔ)一些特定的信息;它對(duì)server是不透明的。

- <exptime> 是終止時(shí)間。假設(shè)為0 ,該項(xiàng)永只是期(盡管它可能被刪除,以便為其它緩存項(xiàng)目騰出位置)。假設(shè)非0(Unix 時(shí)間戳或當(dāng)前時(shí)刻的秒偏移),到達(dá)終止時(shí)間后,client無(wú)法再獲得這項(xiàng)內(nèi)容。

- <bytes> 是隨后的數(shù)據(jù)區(qū)塊的字節(jié)長(zhǎng)度,不包含用于分野的 \r\n 。它能夠是0 (這時(shí)后面尾隨一個(gè)空的數(shù)據(jù)區(qū)塊)。

- <data block> 是大段的8 位數(shù)據(jù),其長(zhǎng)度由前面的命令行中的<bytes>指定。

?

? set 意思是 儲(chǔ)存此數(shù)據(jù)

? add 意思是 儲(chǔ)存此數(shù)據(jù),僅僅在server* 未*保留此鍵值的數(shù)據(jù)時(shí)

? replace 意思是 儲(chǔ)存此數(shù)據(jù),僅僅在server* 曾*保留此鍵值的數(shù)據(jù)時(shí)

?

發(fā)送命令行和數(shù)據(jù)區(qū)塊以后,client等待回復(fù),可能的回復(fù)例如以下:

- "STORED\r\n" 表明成功.

- "NOT_STORED\r\n" 表明數(shù)據(jù)沒(méi)有被存儲(chǔ),但不是由于錯(cuò)誤發(fā)生。這通常意味著add 或replace 命令的條件不成立,或者,項(xiàng)目已經(jīng)位列刪除隊(duì)列(參考后文的 delete 命令)。

?

取回命令

get <key>*\r\n

- <key>* 表示一個(gè)或多個(gè)鍵值,由空格隔開(kāi)的字串這行命令以后,client的等待0 個(gè)或多個(gè)項(xiàng)目,每項(xiàng)都會(huì)收到一行文本,然后跟著數(shù)據(jù)區(qū)塊。全部項(xiàng)目傳送完成后,server發(fā)送下面字串:"END\r\n"來(lái)指示回應(yīng)完成,server用下面形式發(fā)送每項(xiàng)內(nèi)容:

VALUE <key> <flags> <bytes>\r\n

<data block>\r\n

- <key> 是所發(fā)送的鍵名

- <flags> 是存儲(chǔ)命令所設(shè)置的記號(hào)

- <bytes> 是隨后數(shù)據(jù)塊的長(zhǎng)度,* 不包含* 它的界定符 \r\n

- <data block> 是發(fā)送的數(shù)據(jù)

假設(shè)在取回請(qǐng)求中發(fā)送了一些鍵名,而server沒(méi)有送回項(xiàng)目列表,這意味著server沒(méi)這些鍵名(可能由于它們從未被存儲(chǔ),或者為給其它內(nèi)容騰出空間而被刪除,或者到期,或者被已client刪除)。

?

刪除

delete <key> <time>\r\n

- <key> 是client希望server刪除的內(nèi)容的鍵名

- <time> 是一個(gè)單位為秒的時(shí)間(或代表直到某一刻的Unix 時(shí)間),在該時(shí)間內(nèi)server會(huì)拒絕對(duì)于此鍵名的 add replace 命令。此時(shí)內(nèi)容被放入delete 隊(duì)列,無(wú)法再通過(guò) get 得到該內(nèi)容,也無(wú)法是用 add replace 命令(可是 set 命令可用)。直到指定時(shí)間,這些內(nèi)容被終于從server的內(nèi)存中徹底清除。<time> 參數(shù)是可選的,缺省為0(表示內(nèi)容會(huì)立馬清除,并且隨后的存儲(chǔ)命令均可用)。

此命令有一行回應(yīng):- "DELETED\r\n" 表示執(zhí)行成功

- "NOT_FOUND\r\n" 表示沒(méi)有找到這項(xiàng)內(nèi)容

?

添加/ 降低

命令 incr decr 被用來(lái)改動(dòng)數(shù)據(jù),當(dāng)一些內(nèi)容須要替換、添加或降低時(shí)。這些數(shù)據(jù)必須是十進(jìn)制的32 位無(wú)符號(hào)整新。假設(shè)不是,則當(dāng)作0 來(lái)處理。改動(dòng)的內(nèi)容必須存在,當(dāng)使用 incr / decr 命令改動(dòng)不存在的內(nèi)容時(shí),不會(huì)被當(dāng)作0 處理,而是操作失敗。

client發(fā)送命令行:

incr <key> <value>\r\n 或decr <key> <value>\r\n

- <key> 是client希望改動(dòng)的內(nèi)容的建名

- <value> 是client要添加/ 降低的總數(shù)。

回復(fù)為下面集中情形:

- "NOT_FOUND\r\n" 指示該項(xiàng)內(nèi)容的值,不存在。

- <value>\r\n ,<value> 是添加/降低。

注意"decr" 命令發(fā)生下溢:假設(shè)client嘗試降低的結(jié)果小于0 時(shí),結(jié)果會(huì)是0。"incr" 命令不會(huì)發(fā)生溢出。

?

狀態(tài)

命令"stats" 被用于查詢(xún)server的執(zhí)行狀態(tài)和其它內(nèi)部數(shù)據(jù)。有兩種格式。不帶參數(shù)的:

stats\r\n

這會(huì)在隨后輸出各項(xiàng)狀態(tài)、設(shè)定值和文檔。還有一種格式帶有一些參數(shù):

stats <args>\r\n

通過(guò)<args> ,server傳回各種內(nèi)部數(shù)據(jù)。由于隨時(shí)可能發(fā)生變動(dòng),本文不提供參數(shù)的種類(lèi)及其傳回?cái)?shù)據(jù)。

?

各種狀態(tài)

受到無(wú)參數(shù)的"stats" 命令后,server發(fā)送多行內(nèi)容,例如以下:

STAT <name> <value>\r\n

server用下面一行來(lái)終止這個(gè)清單:END\r\n,在每行狀態(tài)中,<name> 是狀態(tài)的名字,<value>使?fàn)顟B(tài)的數(shù)據(jù)。下面清單,是全部的狀態(tài)名稱(chēng),數(shù)據(jù)類(lèi)型,和數(shù)據(jù)代表的含義。

類(lèi)型 一列中,"32u"表示32 位無(wú)符號(hào)整型,"64u"表示64 位無(wú)符號(hào)整型,"32u:32u"表示用冒號(hào)隔開(kāi)的兩個(gè)32 位無(wú)符號(hào)整型。

?

名稱(chēng)

類(lèi)型

含義

pid

32u

server進(jìn)程ID

uptime

32u

server執(zhí)行時(shí)間,單位秒

time

32u

server當(dāng)前的UNIX時(shí)間

version

string

server的版本號(hào)號(hào)

rusage_user

32u

該進(jìn)程累計(jì)的用戶(hù)時(shí)間(秒:微妙)

rusage_system

32u

該進(jìn)程累計(jì)的系統(tǒng)時(shí)間(秒:微妙)

curr_items

32u

server當(dāng)前存儲(chǔ)的內(nèi)容數(shù)量

total_items

32u

server啟動(dòng)以來(lái)存儲(chǔ)過(guò)的內(nèi)容總數(shù)

bytes

64u

server當(dāng)前存儲(chǔ)內(nèi)容所占用的字節(jié)數(shù)

curr_connections

32u

連接數(shù)

total_connections

32u

server執(zhí)行以來(lái)接受的連接總數(shù)

connection_structures

32u

server分配的連接結(jié)構(gòu)的數(shù)量

cmd_get

32u

取回請(qǐng)求總數(shù)

cmd_set

32u

存儲(chǔ)請(qǐng)求總數(shù)

get_hits

32u

請(qǐng)求成功的總次數(shù)

get_misses

32u

請(qǐng)求失敗的總次數(shù)

bytes_read

64u

server從網(wǎng)絡(luò)讀取到的總字節(jié)數(shù)

bytes_written

64u

server向網(wǎng)絡(luò)發(fā)送的總字節(jié)數(shù)

limit_maxbytes

32u

server在存儲(chǔ)時(shí)被同意使用的字節(jié)總數(shù)

?

?假設(shè)不想每次通過(guò)輸入stats來(lái)查看memcache狀態(tài),能夠通過(guò)echo "stats" |nc ?ip port 來(lái)查看,比如:echo "stats" | nc 127.0.0.1 9023。

Memcahce(MC)系列(一)Memcache介紹、使用、存儲(chǔ)、算法、優(yōu)化


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論