一、緩存時(shí),具體是key、value分別是怎樣的數(shù)據(jù)
首先Memcache是一個(gè)基于內(nèi)存的key/value分布式緩存系統(tǒng),不過memcache還可用于緩存其他東西,例如圖片、視頻等等。Redis是一個(gè)開源的基于內(nèi)存亦可持久化的日志型、Key-Value的數(shù)據(jù)庫(kù)。
Redis不僅僅支持簡(jiǎn)單的k/v類型的數(shù)據(jù),同時(shí)還提供list,set,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。
大部分緩存實(shí)現(xiàn)時(shí)都是基于key/value形式,主要是緩存的使用場(chǎng)景決定的。另外,Redis是一種NoSQL數(shù)據(jù)庫(kù),使用場(chǎng)景也不僅僅限于緩存。
Memcached通過使用key-value形式存儲(chǔ)和訪問數(shù)據(jù),在內(nèi)存中維護(hù)一張巨大的HashTable,使得對(duì)數(shù)據(jù)查詢的時(shí)間復(fù)雜度降低到O(1),保證了對(duì)數(shù)據(jù)的高性能訪問。
memcached是多線程,非阻塞IO復(fù)用的網(wǎng)絡(luò)模型,分為監(jiān)聽主線程和worker子線程,監(jiān)聽線程監(jiān)聽網(wǎng)絡(luò)連接,接受請(qǐng)求后,將連接描述字pipe傳遞給worker線程,進(jìn)行讀寫IO,網(wǎng)絡(luò)層使用libevent封裝的事件庫(kù),多線程模型可以發(fā)揮多核作用,但是引入了cache coherency和鎖的問題,比如:memcached最常用的stats命令,實(shí)際memcached所有操作都要對(duì)這個(gè)全局變量加鎖,進(jìn)行技術(shù)等工作,帶來了性能損耗。
延伸閱讀:
二、Memcached內(nèi)存管理機(jī)制
Memcached默認(rèn)使用Slab Allocation機(jī)制管理內(nèi)存,其主要思想是按照預(yù)先規(guī)定的大小,將分配的內(nèi)存分割成特定長(zhǎng)度的塊以存儲(chǔ)相應(yīng)長(zhǎng)度的key-value數(shù)據(jù)記錄,以完全解決內(nèi)存碎片問題。Slab Allocation機(jī)制只為存儲(chǔ)外部數(shù)據(jù)而設(shè)計(jì),也就是說所有的key-value數(shù)據(jù)都存儲(chǔ)在Slab Allocation系統(tǒng)里,而Memcached的其它內(nèi)存請(qǐng)求則通過普通的malloc/free來申請(qǐng),因?yàn)檫@些請(qǐng)求的數(shù)量和頻率決定了它們不會(huì)對(duì)整個(gè)系統(tǒng)的性能造成影響Slab Allocation的原理相當(dāng)簡(jiǎn)單。 如圖所示,它首先從操作系統(tǒng)申請(qǐng)一大塊內(nèi)存,并將其分割成各種尺寸的塊Chunk,并把尺寸相同的塊分成組Slab Class。其中,Chunk就是用來存儲(chǔ)key-value數(shù)據(jù)的最小單位。每個(gè)Slab Class的大小,可以在Memcached啟動(dòng)的時(shí)候通過制定Growth Factor來控制。假定圖中Growth Factor的取值為1.25,如果名列前茅組Chunk的大小為88個(gè)字節(jié),第二組Chunk的大小就為112個(gè)字節(jié),依此類推。