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