一话原、內(nèi)存統(tǒng)計(jì)命令
info memory
該命令會(huì)輸出redis的相關(guān)信息,包括內(nèi)存使用情況,cpu等數(shù)據(jù)
used_memory: redis內(nèi)存分配器分配的內(nèi)存情況通贞,主要是數(shù)據(jù)占用的存儲(chǔ),單位類型是字節(jié)焊夸,
used_memory-rss: redis進(jìn)程占用操作系統(tǒng)內(nèi)存的大小仁连,
men_fragmentation_ratio : 內(nèi)存碎片比例,數(shù)值越大碎片越多阱穗,當(dāng)碎片比較多的話饭冬,可以采用重啟的方式(debug reload)使數(shù)據(jù)從排。正常標(biāo)準(zhǔn)是1.03
men_allcocator: 內(nèi)存分配器揪阶,默認(rèn)使用的時(shí)jemalloc昌抠,該分配器在減少內(nèi)存碎片上處理的比較好
二、內(nèi)存劃分
數(shù)據(jù)
像redis中存儲(chǔ)數(shù)據(jù)鲁僚,通過(guò)對(duì)數(shù)據(jù)進(jìn)行一定的包裝進(jìn)行存儲(chǔ)炊苫,比如redisobject,sds
redis進(jìn)程占用的內(nèi)存
緩存內(nèi)存
比如復(fù)制積壓緩沖區(qū)蕴茴,客戶端緩沖區(qū)劝评,aof緩沖區(qū)
內(nèi)存碎片
當(dāng)清理數(shù)據(jù),但是redis缺無(wú)法釋放數(shù)據(jù)所占有的內(nèi)存倦淀,導(dǎo)致該內(nèi)存無(wú)法被redis使用蒋畜,則就會(huì)出現(xiàn)內(nèi)存碎片
三、數(shù)據(jù)存儲(chǔ)的細(xì)節(jié)
當(dāng)向redis中存儲(chǔ)數(shù)據(jù)的時(shí)候撞叽,首先dictEntry對(duì)象會(huì)存儲(chǔ)數(shù)據(jù)的具體存放位置姻成,相當(dāng)于指針插龄。redisobject具體存儲(chǔ)鍵值對(duì),該對(duì)象內(nèi)部存儲(chǔ)數(shù)據(jù)其實(shí)是用sds進(jìn)行存儲(chǔ)科展。
SDS
sds被稱為動(dòng)態(tài)字符串
struct sdshdr {
????int len;? //已經(jīng)占用的長(zhǎng)度
????int free;? ?//剩余的長(zhǎng)度
????char buf[];??
};
四均牢、優(yōu)化內(nèi)存方法
1.使用jemalloc內(nèi)存分配器
2.使用字符串整型
3.關(guān)注內(nèi)存碎片
內(nèi)存碎片率是一個(gè)重要的參數(shù),對(duì)redis 內(nèi)存的優(yōu)化有重要意義才睹。
如果內(nèi)存碎片率過(guò)高(jemalloc在1.03左右比較正常)徘跪,說(shuō)明內(nèi)存碎片多,內(nèi)存浪費(fèi)嚴(yán)重琅攘;這時(shí)便可以考慮重啟redis服務(wù)垮庐,在內(nèi)存中對(duì)數(shù)據(jù)進(jìn)行重排,減少內(nèi)存碎片坞琴。
如果內(nèi)存碎片率小于1哨查,說(shuō)明redis內(nèi)存不足,部分?jǐn)?shù)據(jù)使用了虛擬內(nèi)存(即swap)剧辐;由于虛擬內(nèi)存的存取速度比物理內(nèi)存差很多(2-3個(gè)數(shù)量級(jí))寒亥,此時(shí)redis的訪問(wèn)速度可能會(huì)變得很慢。因此必須設(shè)法增大物理內(nèi)存(可以增加服務(wù)器節(jié)點(diǎn)數(shù)量荧关,或提高單機(jī)內(nèi)存)溉奕,或減少redis中的數(shù)據(jù)。
要減少redis中的數(shù)據(jù)羞酗,除了選用合適的數(shù)據(jù)類型腐宋、利用共享對(duì)象等,還有一點(diǎn)是要設(shè)置合理的數(shù)據(jù)回收策略(maxmemory-policy)檀轨,當(dāng)內(nèi)存達(dá)到一定量后,根據(jù)不同的優(yōu)先級(jí)對(duì)內(nèi)存進(jìn)行回收欺嗤。