1.概述
Memcached是一個(gè)自由開(kāi)源的,高性能,分布式內(nèi)存對(duì)象緩存系統(tǒng)。
Memcached是一種基于內(nèi)存的key-value存儲(chǔ),用來(lái)存儲(chǔ)小塊的任意數(shù)據(jù)(字符串、對(duì)象)。這些數(shù)據(jù)可以是數(shù)據(jù)庫(kù)調(diào)用、API調(diào)用或者是頁(yè)面渲染的結(jié)果。
Memcached簡(jiǎn)潔而強(qiáng)大。它的簡(jiǎn)潔設(shè)計(jì)便于快速開(kāi)發(fā),減輕開(kāi)發(fā)難度,解決了大數(shù)據(jù)量緩存的很多問(wèn)題。它的API兼容大部分流行的開(kāi)發(fā)語(yǔ)言。
本質(zhì)上,它是一個(gè)簡(jiǎn)潔的key-value存儲(chǔ)系統(tǒng)。
一般的使用目的是,通過(guò)緩存數(shù)據(jù)庫(kù)查詢結(jié)果,減少數(shù)據(jù)庫(kù)訪問(wèn)次數(shù),以提高動(dòng)態(tài)Web應(yīng)用的速度、提高可擴(kuò)展性。
2.特征
memcached作為高速運(yùn)行的分布式緩存服務(wù)器,具有以下的特點(diǎn):
協(xié)議簡(jiǎn)單
基于libevent的事件處理
內(nèi)置內(nèi)存存儲(chǔ)方式
memcached不互相通信的分布式
3.Linux Memcached安裝
Linux系統(tǒng)安裝memcached,首先要先安裝libevent庫(kù):
yum install libevent libevent-devel
安裝 Memcached:
yum install memcached
運(yùn)行 Memcached:(bin -> usr/bin)
/usr/bin/memcached -h
/bin/memcached -h
啟動(dòng)選項(xiàng):
-d是啟動(dòng)一個(gè)守護(hù)進(jìn)程;
-m是分配給Memcache使用的內(nèi)存數(shù)量,單位是MB;
-u是運(yùn)行Memcache的用戶;
-l是監(jiān)聽(tīng)的服務(wù)器IP地址,可以有多個(gè)地址;
-p是設(shè)置Memcache監(jiān)聽(tīng)的端口,最好是1024以上的端口;
-c是最大運(yùn)行的并發(fā)連接數(shù),默認(rèn)是1024;
-P是設(shè)置保存Memcache的pid文件。
(1)作為前臺(tái)程序運(yùn)行:
/bin/memcached -p 11211 -m 64m -vv -u root
(2)作為后臺(tái)服務(wù)程序運(yùn)行:
/bin/memcached -p 11211 -m 64m -u root -d
/bin/memcached? -d -m 1024 -u root -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid
4.Memcached set命令
Memcached set 命令用于將 value(數(shù)據(jù)值) 存儲(chǔ)在指定的 key(鍵) 中。
如果set的key已經(jīng)存在,該命令可以更新該key所對(duì)應(yīng)的原來(lái)的數(shù)據(jù),也就是實(shí)現(xiàn)更新的作用。
語(yǔ)法:
set key flags exptime bytes [noreply]
value
參數(shù)說(shuō)明如下:
key:鍵值 key-value 結(jié)構(gòu)中的 key,用于查找緩存值。
flags:可以包括鍵值對(duì)的整型參數(shù),客戶機(jī)使用它存儲(chǔ)關(guān)于鍵值對(duì)的額外信息 。
exptime:在緩存中保存鍵值對(duì)的時(shí)間長(zhǎng)度(以秒為單位,0 表示永遠(yuǎn))
bytes:在緩存中存儲(chǔ)的字節(jié)數(shù)
noreply(可選): 該參數(shù)告知服務(wù)器不需要返回?cái)?shù)據(jù)
value:存儲(chǔ)的值(始終位于第二行)(可直接理解為key-value結(jié)構(gòu)中的value)
例如:
set foo 0 900 9
memcached
get foo
5.Memcached add 命令
Memcached add 命令用于將 value(數(shù)據(jù)值) 存儲(chǔ)在指定的 key(鍵) 中。
如果 add 的 key 已經(jīng)存在,則不會(huì)更新數(shù)據(jù)(過(guò)期的 key 會(huì)更新),之前的值將仍然保持相同,并且您將獲得響應(yīng) NOT_STORED。
語(yǔ)法:
add key flags exptime bytes [noreply]
value
例如:
add new_key 0 900 10
data_value
6.Memcached replace 命令
Memcached replace 命令用于替換已存在的 key(鍵) 的 value(數(shù)據(jù)值)。
如果 key 不存在,則替換失敗,并且您將獲得響應(yīng) NOT_STORED。
語(yǔ)法:
replace key flags exptime bytes [noreply]
value
例如:
add mykey 0 900 10
data_value
get mykey
replace mykey 0 900 16
some_other_value
7.Memcached append 命令
Memcached append 命令用于向已存在 key(鍵) 的 value(數(shù)據(jù)值) 后面追加數(shù)據(jù) 。
語(yǔ)法:
append key flags exptime bytes [noreply]
value
8.Memcached prepend 命令
Memcached prepend 命令用于向已存在 key(鍵) 的 value(數(shù)據(jù)值) 前面追加數(shù)據(jù) 。
用法:
prepend key flags exptime bytes [noreply]
value
例如:
set foo 0 900 9
memcached
STORED
get foo
VALUE foo 0 9
memcached
END
prepend foo 0 900 5
redis
STORED
get foo
VALUE foo 0 14
redismemcached
END
9.Memcached get 命令
Memcached get 命令獲取存儲(chǔ)在 key(鍵) 中的 value(數(shù)據(jù)值) ,如果 key 不存在,則返回空。
語(yǔ)法:
get key
多個(gè) key 使用空格隔開(kāi),如下:
get key1 key2 key3
10.Memcached delete 命令
Memcached delete 命令用于刪除已存在的 key(鍵)。
語(yǔ)法:
delete key [noreply]
11.Memcached incr 與 decr 命令
Memcached incr 與 decr 命令用于對(duì)已存在的 key(鍵) 的數(shù)字值進(jìn)行自增或自減操作。
incr 與 decr 命令操作的數(shù)據(jù)必須是十進(jìn)制的32位無(wú)符號(hào)整數(shù)。
如果 key 不存在返回 NOT_FOUND,如果鍵的值不為數(shù)字,則返回 CLIENT_ERROR,其他錯(cuò)誤返回 ERROR。
incr 命令語(yǔ)法:
incr key increment_value
例如:
set no 0 900 2
10
incr no 5
decr 命令語(yǔ)法:
decr key decrement_value
例如:
decr no?5
5
12.Memcached stats 命令
Memcached stats 命令用于返回統(tǒng)計(jì)信息例如 PID(進(jìn)程號(hào))、版本號(hào)、連接數(shù)等。
stats
STAT pid 81160? //memcache服務(wù)器進(jìn)程ID
STAT uptime 18639? //服務(wù)器已運(yùn)行秒數(shù)
STAT time 1565081958? //服務(wù)器當(dāng)前Unix時(shí)間戳
STAT version 1.4.15? //memcache版本
STAT libevent 2.0.21-stable //libevent版本
STAT pointer_size 64? //操作系統(tǒng)指針大小
STAT rusage_user 0.439147 //進(jìn)程累計(jì)用戶時(shí)間
STAT rusage_system 0.243970? //進(jìn)程累計(jì)系統(tǒng)時(shí)間
STAT curr_connections 5? //當(dāng)前連接數(shù)量
STAT total_connections 10? //Memcached運(yùn)行以來(lái)連接總數(shù)
STAT connection_structures 7? //Memcached分配的連接結(jié)構(gòu)數(shù)量
STAT reserved_fds 20? //內(nèi)部使用的FD數(shù)
STAT cmd_get 42? //get命令請(qǐng)求次數(shù)
STAT cmd_set 24? //set命令請(qǐng)求次數(shù)
STAT cmd_flush 0 //flush命令請(qǐng)求次數(shù)
STAT cmd_touch 0 //touch命令請(qǐng)求總數(shù)
STAT get_hits 33 //get命令命中次數(shù)
STAT get_misses 9//get命令未命中次數(shù)
STAT delete_misses 1 //delete命令未命中次數(shù)
STAT delete_hits 2? //delete命令命中次數(shù)
STAT incr_misses 0? //incr命令未命中次數(shù)
STAT incr_hits 1? ? //incr命令命中次數(shù)
STAT decr_misses 0? //decr命令未命中次數(shù)
STAT decr_hits 3? ? //decr命令命中次數(shù)
STAT cas_misses 0? ? //cas命令未命中次數(shù)
STAT cas_hits 0? ? ? //cas命令命中次數(shù)
STAT cas_badval 1? ? //使用擦拭次數(shù)
STAT touch_hits 0? ? //touch命中次數(shù)
STAT touch_misses 0? //touch未命中次數(shù)
STAT auth_cmds 0? ? //認(rèn)證命令處理的次數(shù)
STAT auth_errors 0? //認(rèn)證失敗數(shù)目
STAT bytes_read 1554 //讀取總字節(jié)數(shù)
STAT bytes_written 3902? //發(fā)送總字節(jié)數(shù)
STAT limit_maxbytes 1073741824? //分配的內(nèi)存總大小(字節(jié))
STAT accepting_conns 1? //服務(wù)器是否達(dá)到過(guò)最大連接(0/1)
STAT listen_disabled_num 0? //失效的監(jiān)聽(tīng)數(shù)
STAT threads 4 //當(dāng)前線程數(shù)
STAT conn_yields 0 //連接操作主動(dòng)放棄數(shù)目
STAT hash_power_level 16? //hash表等級(jí)
STAT hash_bytes 524288? ? //當(dāng)前hash表大小
STAT hash_is_expanding 0? //hash表正在擴(kuò)展
STAT bytes 74? ? ? //當(dāng)前存儲(chǔ)占用的字節(jié)數(shù)
STAT curr_items 1? //當(dāng)前存儲(chǔ)的數(shù)據(jù)總數(shù)
STAT total_items 21 //啟動(dòng)以來(lái)存儲(chǔ)的數(shù)據(jù)總數(shù)
STAT expired_unfetched 0? //已過(guò)期但未獲取大對(duì)象數(shù)目
STAT evicted_unfetched 0? //已驅(qū)逐但未獲取大對(duì)象數(shù)目
STAT evictions 0? ? //LRU釋放的對(duì)象數(shù)目
STAT reclaimed 4? ? //已過(guò)期的數(shù)據(jù)條目來(lái)存儲(chǔ)新數(shù)據(jù)的數(shù)目
END
13.Memcached stats items 命令
Memcached stats items 命令用于顯示各個(gè) slab 中 item 的數(shù)目和存儲(chǔ)時(shí)長(zhǎng)(最后一次訪問(wèn)距離現(xiàn)在的秒數(shù))。
stats items
STAT items:1:number 1? //該slab中對(duì)象數(shù)(不包含過(guò)期對(duì)象)
STAT items:1:age 884? //LRU隊(duì)列中最老對(duì)象的過(guò)期時(shí)間
STAT items:1:evicted 0 //LRU釋放對(duì)象數(shù)
STAT items:1:evicted_nonzero 0? //設(shè)置了非0時(shí)間的LRU釋放對(duì)象數(shù)
STAT items:1:evicted_time 0 //最后一次LRU釋放的對(duì)象存在時(shí)間
STAT items:1:outofmemory 0 //不能存儲(chǔ)對(duì)象次數(shù)
STAT items:1:tailrepairs 0 //修復(fù)slabs次數(shù)
STAT items:1:reclaimed 4 //使用過(guò)期對(duì)象空間存儲(chǔ)對(duì)象次數(shù)
STAT items:1:expired_unfetched 0//已過(guò)期但未獲取的對(duì)象數(shù)目
STAT items:1:evicted_unfetched 0//已驅(qū)逐但未獲取的對(duì)象數(shù)目
END
14. 參考
《Memcached 教程 | 菜鳥(niǎo)教程》