Redis 是單進(jìn)程單線程的工作模式,所有的請(qǐng)求都被排隊(duì)處理處理,因此緩存數(shù)據(jù)沒(méi)有互斥的需求。而 Memcached 是單進(jìn)程多線程的工作模式,請(qǐng)求到達(dá)時(shí),主線程會(huì)將請(qǐng)求分發(fā)給多個(gè)工作線程,因此必須要做數(shù)據(jù)的互斥。
在處理請(qǐng)求的能力上,兩者是不相上下的。理論上在一臺(tái)支持多線程的機(jī)器上,Memecached 的 get 操作的吞吐量會(huì)較 Redis 高。
那到底是多線程還是單線程優(yōu)秀?多線程一般會(huì)增加程序邏輯的復(fù)雜度,需要考慮線程與線程之間的同步與互斥,一定程度上拉低了每個(gè)線程的吞吐量(工作量),更多的時(shí)間是花在了等待互斥鎖上。一般建議在系統(tǒng)設(shè)計(jì)的時(shí)候多考慮系統(tǒng)的橫向擴(kuò)展性。
使用每個(gè)進(jìn)程單個(gè)線程的模式。這里沒(méi)有信條,不是非黑即白,就看什么樣的方法解決什么樣的問(wèn)題了。
Redis 有豐富的原生數(shù)據(jù)結(jié)構(gòu),包括字符串,鏈表,集合,有序集合,哈希表,二進(jìn)制數(shù)組等,可見(jiàn) Redis 能適用于更多的場(chǎng)景,可以當(dāng)作一個(gè)數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)庫(kù)。Memcached 在這方面較 Redis 遜色,只能做簡(jiǎn)單的 key/value 存儲(chǔ)。
除了上面所說(shuō),與 Memcached 比較:
對(duì)比下來(lái),Redis 好玩多了。
曾經(jīng)被問(wèn)到 Redis 和 Memcached 哪個(gè)更快?在測(cè)試的時(shí)候,需要保證測(cè)試的客觀環(huán)境是一樣的,這包括測(cè)試機(jī)器,客戶端除了在構(gòu)造協(xié)議的邏輯部分不一樣外,其他都應(yīng)該是保持一致的。
測(cè)試環(huán)境:
ubuntu, Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz 4 核心
memcache 1.4.14
redis 3.1.99
測(cè)試概括了一些結(jié)論:
默認(rèn)情況下,Memcached 默認(rèn)鍵長(zhǎng)設(shè)置為 256B,存儲(chǔ)數(shù)據(jù)長(zhǎng)度限制為 1M??梢酝ㄟ^(guò) Memcached 的 -I 選項(xiàng)調(diào)整默認(rèn) slab 頁(yè)面大小,從而可以調(diào)整存儲(chǔ)數(shù)據(jù)長(zhǎng)度的限制,但 Memcached 官方是不建議這種做法的。
沒(méi)有非黑即白的答案,只有哪個(gè)工具在哪種場(chǎng)景下更為適用。