memcache學(xué)習(xí)筆記

memcache簡介

memcache是一個自由、源碼開放、高性能、分布式的分布式內(nèi)存對象緩存系統(tǒng),用于動態(tài)WEB應(yīng)用以減輕數(shù)據(jù)庫的負(fù)載。它通過在內(nèi)存中緩存數(shù)據(jù)和對象來減少讀取數(shù)據(jù)庫的次數(shù),從而提高了網(wǎng)站的訪問速度。

memcache是一個存儲鍵值對的HashMap,在內(nèi)存中對任意的數(shù)據(jù)(比如字符串、對象等)所使用的鍵值存儲,數(shù)據(jù)可以來自數(shù)據(jù)庫調(diào)用、API調(diào)用,或者頁面渲染的結(jié)果。memcache設(shè)計理念就是小而強大,它簡單的設(shè)計促進了快速部署、易于開發(fā)并解決面對大規(guī)模的數(shù)據(jù)緩存的許多難題,而所開放的API使得memchace能用于Java、C/C++/C#、Perl、Python、PHP、Ruby等大部分流行的程序語言。

memcache雖然被稱為"分布式緩存",但其本身完全不具備分布式的功能,即memcache集群之間不會相互通信,所謂分布式完全依賴于客戶端。而且不支持持久存儲,僅支持存儲流式化數(shù)據(jù)。

memcache安裝

yum install memcache

memcached默認(rèn)沒有認(rèn)證機制,可借用于SASL進行認(rèn)證;(SASL:Simple Authentication Secure Layer)
分布式系統(tǒng)請求路由方法:取模法,一致性哈希算法;
算法復(fù)雜度:O(1)
清理過期緩存項:
緩存耗盡:LRU(Least recently used,最近最少使用)算法根據(jù)數(shù)據(jù)的歷史訪問記錄來進行淘汰數(shù)據(jù),其核心思想是“如果數(shù)據(jù)最近被訪問過,那么將來被訪問的幾率也更高”。
緩存項過期:惰性清理機制(即緩存項過期后不會立即清理,而是會把過期項標(biāo)記為不可用)
默認(rèn)監(jiān)聽的端口:11211/tcp, 11211/udp
相關(guān)文件:
主程序:/usr/bin/memcached
配置文件:/etc/sysconfig/memcached
Unit File:memcached.service
協(xié)議格式:memcached協(xié)議
文本格式
二進制格式

memcache設(shè)置

啟動方式:

-d 以守護程序( daemon )方式運行

-u root 指定用戶,如果當(dāng)前為 root ,需要使用此參數(shù)指定用戶

-P / tmp/ / a.pid 保存 PID 到指定文件

內(nèi)存設(shè)置:

-m 1024 數(shù)據(jù)內(nèi)存數(shù)量,不包含 memcached 本身占用,單位為 MB

-M 內(nèi)存不夠時禁止 LRU ,報錯

-n 48 初始 chunk=key+suffix+value+32 結(jié)構(gòu)體,默認(rèn) 48 字節(jié)

-f 1.25 增長因子,默認(rèn) 1.25

-L 啟用大內(nèi)存頁,可以降低內(nèi)存浪費,改進性能

連接設(shè)置:

-l 127.0.0.1 監(jiān)聽的 IP 地址,本機可以不設(shè)置此參數(shù)

-p 11211 TCP 端口,默認(rèn)為 11211 ,可以不設(shè)置

-U 11211 UDP 端口,默認(rèn)為 11211 ,0 0 為關(guān)閉

并發(fā)設(shè)置:

-c 1024 最大并發(fā)連接數(shù),默認(rèn) 1024 ,最好是 200

-t 4 線程數(shù),默認(rèn)4 4 。由于 memcached 采用 NIO ,所以更多線程沒有太多作用

-R 20 每個 event 連接最大并發(fā)數(shù),默認(rèn) 20

-C 禁用 CAS

memcache管理

管理命令格式:

<command name> <key> <flags> <exptime> <bytes> <data block>

參數(shù)說明:
command name:管理命令(set、add、replace)
key:查找關(guān)鍵詞
flags:客戶端使用它存儲關(guān)于鍵值對的額外信息
exptime:該數(shù)據(jù)的存活時間,0表示永久有效
bytes:存儲字節(jié)數(shù)
data block:存儲的數(shù)據(jù)塊(即鍵值對中的值)
存儲命令 set/add/replace/append/prepend/cas
讀取命令 get =bget? /gets
刪除命令 delete
計數(shù)命令 incr/decr
統(tǒng)計命令 stats/settings/items/sizes/slabs
工具 memcached- - tool

存儲命令:

<command> <key> <datablock>

set無論如何都進行存儲

add只有數(shù)據(jù)不存在時進行添加

repalce只有數(shù)據(jù)存在時進行替換

append往后追加:append <key> datablock <status>?

prepend往前追加:prepend <key> datablock <status>

cas按版本號更改

讀取命令:

get 普通查詢

gets 用于查詢帶版本的值

cas即check and set 只有在版本號相匹配時才能存儲,否則返回exits,設(shè)計意圖:解決多客戶端并發(fā)修改同一條記錄的問題,防止使用經(jīng)過改變了的value/key對

v計數(shù)命令:

incr/decr<key><int>

計數(shù)要求:key 必須存在,value必須是數(shù)字

刪除命令:

delete<key>[<time>]

time:秒數(shù)或者unixtime,在time時間內(nèi)不能add或者replace也不能get,但是能set。

stats命令

stats [<args>]\r\n

pid Memcached進程ID
uptime Memcached運行時間,單位:秒
time Memcached當(dāng)前的UNIX時間
version Memcached的版本號
分析CPU占用是否高
    rusage_user 該進程累計的用戶時間,單位:秒
    rusage_system 該進程累計的系統(tǒng)時間,單位:秒
分析連接數(shù)是否太多
    curr_connections 當(dāng)前連接數(shù)量
    total_connections Memcached運行以來接受的連接總數(shù)
connection_structures Memcached分配的連接結(jié)構(gòu)的數(shù)量
分析命中率是否太低
    cmd_get 查詢請求總數(shù)
    get_hits 查詢成功獲取數(shù)據(jù)的總次數(shù)
    get_misses 查詢成功未獲取到數(shù)據(jù)的總次數(shù)
cmd_set 存儲(添加/更新)請求總數(shù)
分析字節(jié)數(shù)流量
    bytes Memcached當(dāng)前存儲內(nèi)容所占用字節(jié)數(shù)
    bytes_read Memcached從網(wǎng)絡(luò)讀取到的總字節(jié)數(shù)
    bytes_written Memcached向網(wǎng)絡(luò)發(fā)送的總字節(jié)數(shù)
    limit_maxbytes Memcached在存儲時被允許使用的字節(jié)總數(shù)
分析對象數(shù)LRU頻率
curr_items Memcached當(dāng)前存儲的內(nèi)容數(shù)量
total_items Memcached啟動以來存儲過的內(nèi)容總數(shù)
evictions LRU釋放對象數(shù),用來釋放內(nèi)存

stats setting查看設(shè)置

maxbytes 最大字節(jié)數(shù)限制,0無限制
maxconns 允許最大連接數(shù)
tcpport TCP端口
udpport UDP端口
inter
verbosity 日志0=none,1=som,2=lots
oldest 最老對象過期時間
evictions on/off,是否禁用LRU
domain_socket socket的domain
umask 創(chuàng)建Socket時的umask
growth_factor 增長因子
chunk_size key+value+flags大小
num_threads 線程數(shù),可以通過-t設(shè)置,默認(rèn)4
stat_key_prefix stats分隔符
detail_enabled yes/no,顯示stats細(xì)節(jié)信息
reqs_per_event 最大IO吞吐量(每event)
cas_enabled yes/no,是否啟用CAS,-C禁用
tcp_backlog TCP監(jiān)控日志
auth_enabled_sasl yes/no,是否啟用SASL驗證
number 該slab中對象數(shù),不包含過期對象
age LRU隊列中最老對象的過期時間
evicted LRU釋放對象數(shù)
evicted_nonzero 設(shè)置了非0時間的LRU釋放對象數(shù)
evicted_time 最后一次LRU秒數(shù),監(jiān)控頻率
outofmemory 不能存儲對象次數(shù),使用-M會報錯
tailrepairs 修復(fù)slabs次數(shù)
reclaimed 使用過期對象空間存儲對象次數(shù)

stats size對象數(shù)量統(tǒng)計格式:

STAT <size> <count>

注意:會鎖定服務(wù),暫停處理請求
stats slab區(qū)塊統(tǒng)計

區(qū)塊數(shù)量:
chunk_size chunk大小,byte
chunks_per_page 每個page的chunk數(shù)量
total_pages page數(shù)量
total_chunks chunk數(shù)量*page數(shù)量
命中率
get_hits get命中數(shù)
cmd_set set數(shù)
delete_hits delete命中數(shù)
incr_hits incr命中數(shù)
decr_hits decr命中數(shù)
cas_hits cas命中數(shù)
cas_badval cas數(shù)據(jù)類型錯誤數(shù)
分析占用情況
used_chunks 已被分配的chunk數(shù)
free_chunks 剩余chunk數(shù)
free_chunks_end 分完page浪費chunk數(shù)
mem_requested 請求存儲的字節(jié)數(shù)

active_slabs slab數(shù)量
total_malloced 總內(nèi)存數(shù)量

被浪費內(nèi)存數(shù)=(total_chunks * chunk_size) - mem_requested
如果太大,需要調(diào)整factor
其他命令
version 查看版本號
flush_all 清理所有
quit 退出

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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