以圖為例
Cache A、Cache B,Cache C為三臺(tái)Memcached服務(wù)器
根據(jù)三臺(tái)Memcached的IP和端口,計(jì)算出他們的Hash值,然后分布在整個(gè)圓環(huán)上
每?jī)膳_(tái)Memcached服務(wù)器的Hash值之間為一個(gè)區(qū)間
Key1、Key2、Key3、Key4
為要存儲(chǔ)在Memcached里的4個(gè)Key
根據(jù)4個(gè)Key計(jì)算出他們的Hash值,同樣也落在這個(gè)圓環(huán)上
在這個(gè)環(huán)形空間中,如果沿著順時(shí)針?lè)较驈膶?duì)象的 key 值出發(fā),直到遇見(jiàn)一個(gè) cache ,那么就將該對(duì)象存儲(chǔ)在這個(gè) cache 上,因?yàn)閷?duì)象和 cache 的 hash 值是固定的,因此這個(gè) cache 必然是唯一和確定的。
根據(jù)上面的方法,對(duì)象 key1 將被存儲(chǔ)到 cache A 上; key2 和 key3 對(duì)應(yīng)到 cache C ; key4 對(duì)應(yīng)到 cache B;
同一個(gè)key不是三臺(tái)服務(wù)器上面都有映射, 只會(huì)映射到其中一臺(tái)服務(wù)器上面
集群中其中一個(gè)Memcached節(jié)點(diǎn)宕機(jī),會(huì)導(dǎo)致存在著上面的Key全部失效而重新對(duì)這些key進(jìn)行hash
對(duì)其他活著的Memcached節(jié)點(diǎn)上的key沒(méi)有影響
如果是集群
Set和Get時(shí)觸發(fā)操作的是否為同一個(gè)配置
如果是多個(gè)應(yīng)用服務(wù)器觸發(fā)Set、Get操作,每一個(gè)的Memcached節(jié)點(diǎn)配置順序是否相同
可以通過(guò)telnet的方式,去Memcached節(jié)點(diǎn)上Get一下響應(yīng)的Key,看是否真的過(guò)期
你分析一下你的slab構(gòu)成,看看每個(gè)slab分配了多少page頁(yè),加起來(lái)是不是跟總分配內(nèi)存一樣,如果是一樣的表示你的內(nèi)存已經(jīng)分配完了,每個(gè)slab只能使用已分配的大小,不能再增漲。再分析一下存這個(gè)value的slab的大小,如果比較小,且hits量很大,就會(huì)出現(xiàn)你這樣的情況,剛存沒(méi)多久的數(shù)據(jù)沒(méi)到過(guò)期就會(huì)被擠掉。
失效就幾種可能:
1,cache滿(mǎn)了,剛插進(jìn)去就被lru剔出來(lái)
2,失效時(shí)間設(shè)置不對(duì),導(dǎo)致數(shù)據(jù)一插進(jìn)去就失效(不能超過(guò)30天)
使用了64的操作系統(tǒng),能分配2GB以上的內(nèi)存。32位操作系統(tǒng)中,每個(gè)進(jìn)程最多只能使用2GB內(nèi)存。可以啟動(dòng)多個(gè)分配2GB以下內(nèi)存的進(jìn)程,但這樣一臺(tái)服務(wù)器上的TCP連接數(shù)就會(huì)成倍增加,管理上也變得復(fù)雜,所以盡量統(tǒng)一使用了64位操作系統(tǒng)。
另外,最好分配內(nèi)存為3GB,是因?yàn)閮?nèi)存分配量超過(guò)這個(gè)值,就有可能導(dǎo)致內(nèi)存交換(swap),memcached的內(nèi)存存儲(chǔ)“slab”, memcached啟動(dòng)時(shí)指定的內(nèi)存分配量是memcached用于保存數(shù)據(jù)的量,沒(méi)有包括“slab”本身占用的內(nèi)存、以及為了保存數(shù)據(jù)而設(shè)置的管理空間。因此,memcached進(jìn)程的實(shí)際內(nèi)存分配量要比指定的容量要大。
如果在memcached中的數(shù)據(jù)大部分都比較小。這樣,進(jìn)程的大小要比指定的容量大很多。因此,改變內(nèi)存分配量進(jìn)行驗(yàn)證,確認(rèn)了3GB的大小不會(huì)引發(fā)swap。
64位操作系統(tǒng)不受限制(小于你的物理內(nèi)存大小即可),不過(guò)得注意Memcache軟件本身是有內(nèi)存消耗的(相比可以忽略),但這點(diǎn)還是注意一下。