redis和memcahe都是通過(guò)tcp直接存取的
?
在選擇內(nèi)存數(shù)據(jù)庫(kù)的時(shí)候到底什么時(shí)候選擇redis,什么時(shí)候選擇memcache,然后就查到下面對(duì)應(yīng)的資料,是來(lái)自redis作者的說(shuō)法(stackoverflow上面)。
? ? You should not care too much about performances. Redis is faster per core with small values, but memcached is able to use multiple cores with a single executable and TCP port without help from the client. Also memcached is faster with big values in the order of 100k. Redis recently improved a lot about big values (unstable branch) but still memcached is faster in this use case. The point here is: nor one or the other will likely going to be your bottleneck for the query-per-second they can deliver.
? ? You should care about memory usage. For simple key-value pairs memcached is more memory efficient. If you use Redis hashes, Redis is more memory efficient. Depends on the use case.
? ??You should care about persistence and replication, two features only available in Redis. Even if your goal is to build a cache it helps that after an upgrade or a reboot your data are still there.
? ??You should care about the kind of operations you need. In Redis there are a lot of complex operations, even just considering the caching use case, you often can do a lot more in a single operation, without requiring data to be processed client side (a lot of I/O is sometimes needed). This operations are often as fast as plain GET and SET. So if you don’t need just GEt/SET but more complex things Redis can help a lot (think at timeline caching).
? ? 有網(wǎng)友翻譯如下[1]:
? ??沒有必要過(guò)多的關(guān)注性能。由于Redis只使用單核,而Memcached可以使用多核,所以在比較上,平均每一個(gè)核上Redis在存儲(chǔ)小數(shù)據(jù)時(shí)比Memcached性能更高。而在100k以上的數(shù)據(jù)中,Memcached性能要高于Redis,雖然Redis最近也在存儲(chǔ)大數(shù)據(jù)的性能上進(jìn)行優(yōu)化,但是比起Memcached,還是稍有遜色。說(shuō)了這么多,結(jié)論是,無(wú)論你使用哪一個(gè),每秒處理請(qǐng)求的次數(shù)都不會(huì)成為瓶頸。
為什么這么說(shuō)呢,理由就是Redis是單線程運(yùn)行的。
因?yàn)槭菃尉€程運(yùn)行,所以和Memcached的多線程相比,整體性能肯定會(huì)偏低。
因?yàn)槭菃尉€程運(yùn)行,所以IO是串行化的,網(wǎng)絡(luò)IO和內(nèi)存IO,因此當(dāng)單條數(shù)據(jù)太大時(shí),由于需要等待一個(gè)命令的所有IO完成才能進(jìn)行后續(xù)的命令,所以性能會(huì)受影響。
而就內(nèi)存使用上來(lái)說(shuō),目前Redis結(jié)合了tcmalloc和jemalloc兩個(gè)內(nèi)存分配器,基本上和Memcached不相伯仲。如果是簡(jiǎn)單且有規(guī)律的key value存儲(chǔ),那么用Redis的hash結(jié)構(gòu)來(lái)做,內(nèi)存使用上會(huì)驚人的變小,優(yōu)勢(shì)是很明顯的。
?
http://www.biaodianfu.com/redis-vs-memcached.html
? ??你需要關(guān)注內(nèi)存使用率。對(duì)于key-value這樣簡(jiǎn)單的數(shù)據(jù)儲(chǔ)存,memcache的內(nèi)存使用率更高。如果采用hash結(jié)構(gòu),redis的內(nèi)存使用率會(huì)更高。當(dāng)然,這些都依賴于具體的應(yīng)用場(chǎng)景。
? ??你需要關(guān)注關(guān)注數(shù)據(jù)持久化和主從復(fù)制時(shí),只有redis擁有這兩個(gè)特性。如果你的目標(biāo)是構(gòu)建一個(gè)緩存在升級(jí)或者重啟后之前的數(shù)據(jù)不會(huì)丟失的話,那也只能選擇redis。
? ??你應(yīng)該關(guān)心你需要的操作。redis支持很多復(fù)雜的操作,甚至只考慮內(nèi)存的使用情況,在一個(gè)單一操作里你常常可以做很多,而不需要將數(shù)據(jù)讀取到客戶端中(這樣會(huì)需要很多的IO操作)。這些復(fù)雜的操作基本上和純GET和POST操作一樣快,所以你不只是需要GET/SET而是更多的操作時(shí),redis會(huì)起很大的作用。
? ??對(duì)于兩者的選擇還是要看具體的應(yīng)用場(chǎng)景,如果需要緩存的數(shù)據(jù)只是key-value這樣簡(jiǎn)單的結(jié)構(gòu)時(shí),我在項(xiàng)目里還是采用memcache,它也足夠的穩(wěn)定可靠。如果涉及到存儲(chǔ),排序等一系列復(fù)雜的操作時(shí),毫無(wú)疑問(wèn)選擇redis。
? ?
? ? 關(guān)于redis和memcache的不同,下面羅列了一些相關(guān)說(shuō)法,供記錄:
? ??redis和memecache的不同在于[2]:
? ? 1、存儲(chǔ)方式:
? ? memecache 把數(shù)據(jù)全部存在內(nèi)存之中,斷電后會(huì)掛掉,數(shù)據(jù)不能超過(guò)內(nèi)存大小
? ? redis有部份存在硬盤上,這樣能保證數(shù)據(jù)的持久性,支持?jǐn)?shù)據(jù)的持久化(筆者注:有快照和AOF日志兩種持久化方式,在實(shí)際應(yīng)用的時(shí)候,要特別注意配置文件快照參數(shù),要不就很有可能服務(wù)器頻繁滿載做dump)。
? ? 2、數(shù)據(jù)支持類型:
? ? redis在數(shù)據(jù)支持上要比memecache多的多。
? ? 3、使用底層模型不同:
? ? 新版本的redis直接自己構(gòu)建了VM 機(jī)制 ,因?yàn)橐话愕南到y(tǒng)調(diào)用系統(tǒng)函數(shù)的話,會(huì)浪費(fèi)一定的時(shí)間去移動(dòng)和請(qǐng)求。
? ? 4、運(yùn)行環(huán)境不同:
? ? redis目前官方只支持LINUX 上去行,從而省去了對(duì)于其它系統(tǒng)的支持,這樣的話可以更好的把精力用于本系統(tǒng) 環(huán)境上的優(yōu)化,雖然后來(lái)微軟有一個(gè)小組為其寫了補(bǔ)丁。但是沒有放到主干上
5、 分布式存儲(chǔ)
redis支持master-slave復(fù)制模式
memcache可以使用一致性hash做分布式
6、 value大小不同
?memcache是一個(gè)內(nèi)存緩存,key的長(zhǎng)度小于250字符,單個(gè)item存儲(chǔ)要小于1M,不適合虛擬機(jī)使用
7、 數(shù)據(jù)一致性不同
redis使用的是單線程模型,保證了數(shù)據(jù)按順序提交。
memcache需要使用cas保證數(shù)據(jù)一致性。CAS(Check and Set)是一個(gè)確保并發(fā)一致性的機(jī)制,屬于“樂(lè)觀鎖”范疇;原理很簡(jiǎn)單:拿版本號(hào),操作,對(duì)比版本號(hào),如果一致就操作,不一致就放棄任何操作
8、 cpu利用
redis單線程模型只能使用一個(gè)cpu,可以開啟多個(gè)redis進(jìn)程
9、 3. Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
10、 ?Redis和Memcache都是將數(shù)據(jù)存放在內(nèi)存中,都是內(nèi)存數(shù)據(jù)庫(kù)。不過(guò)memcache還可用 于緩存其他東西,例如圖片、視頻等等。
?
個(gè)人總結(jié)一下,有持久化需求或者對(duì)數(shù)據(jù)結(jié)構(gòu)和處理有高級(jí)要求的應(yīng)用,選擇redis,其他簡(jiǎn)單的key/value存儲(chǔ),選擇memcache。
?
redis使用場(chǎng)景:
http://www.linuxeden.com/html/itnews/20131010/144377.html
redis集群:
http://www.cnblogs.com/lulu/archive/2013/06/10/3130878.html
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
