Redis与Memcached的比较
Redis與Memcached的比較
Memcached是多線程,非阻塞IO復用的網(wǎng)絡(luò)模型,分為監(jiān)聽主線程和worker子線程,監(jiān)聽線程監(jiān)聽網(wǎng)絡(luò)連接,接受請求后,將連接描述字pipe 傳遞給worker線程,進行讀寫IO, 網(wǎng)絡(luò)層使用libevent封裝的事件庫,多線程模型可以發(fā)揮多核作用,但是引入了cache coherency和鎖的問題,比如,Memcached最常用的stats 命令,實際Memcached所有操作都要對這個全局變量加鎖,進行計數(shù)等工作,帶來了性能損耗。
(Memcached網(wǎng)絡(luò)IO模型)
Redis使用單線程的IO復用模型,自己封裝了一個簡單的AeEvent事件處理框架,主要實現(xiàn)了epoll、kqueue和select,對于單純只有IO操作來說,單線程可以將速度優(yōu)勢發(fā)揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序、聚合等,對于這些操作,單線程模型實際會嚴重影響整體吞吐量,CPU計算過程中,整個IO調(diào)度都是被阻塞住的。
Memcached使用預分配的內(nèi)存池的方式,使用slab和大小不同的chunk來管理內(nèi)存,Item根據(jù)大小選擇合適的chunk存儲,內(nèi)存池的方式可以省去申請/釋放內(nèi)存的開銷,并且能減小內(nèi)存碎片產(chǎn)生,但這種方式也會帶來一定程度上的空間浪費,并且在內(nèi)存仍然有很大空間時,新的數(shù)據(jù)也可能會被剔除,原因可以參考Timyang的文章:http://timyang.net/data/Memcached-lru-evictions/
Redis使用現(xiàn)場申請內(nèi)存的方式來存儲數(shù)據(jù),并且很少使用free-list等方式來優(yōu)化內(nèi)存分配,會在一定程度上存在內(nèi)存碎片,Redis跟據(jù)存儲命令參數(shù),會把帶過期時間的數(shù)據(jù)單獨存放在一起,并把它們稱為臨時數(shù)據(jù),非臨時數(shù)據(jù)是永遠不會被剔除的,即便物理內(nèi)存不夠,導致swap也不會剔除任何非臨時數(shù)據(jù)(但會嘗試剔除部分臨時數(shù)據(jù)),這點上Redis更適合作為存儲而不是cache。
Memcached提供了cas命令,可以保證多個并發(fā)訪問操作同一份數(shù)據(jù)的一致性問題。 Redis沒有提供cas 命令,并不能保證這點,不過Redis提供了事務(wù)的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷。
Memcached基本只支持簡單的key-value存儲,不支持枚舉,不支持持久化和復制等功能
Redis除key/value之外,還支持list,set,sorted set,hash等眾多數(shù)據(jù)結(jié)構(gòu),提供了KEYS
進行枚舉操作,但不能在線上使用,如果需要枚舉線上數(shù)據(jù),Redis提供了工具可以直接掃描其dump文件,枚舉出所有數(shù)據(jù),Redis還同時提供了持久化和復制等功能。
在不同語言的客戶端方面,Memcached和Redis都有豐富的第三方客戶端可供選擇,不過因為Memcached發(fā)展的時間更久一些,目前看在客戶端支持方面,Memcached的很多客戶端更加成熟穩(wěn)定,而Redis由于其協(xié)議本身就比Memcached復雜,加上作者不斷增加新的功能等,對應第三方客戶端跟進速度可能會趕不上,有時可能需要自己在第三方客戶端基礎(chǔ)上做些修改才能更好的使用。
根據(jù)以上比較不難看出,當我們不希望數(shù)據(jù)被踢出,或者需要除key/value之外的更多數(shù)據(jù)類型時,或者需要落地功能時,使用Redis比使用Memcached更合適。
來源:http://blog.chinaunix.net/uid-26111972-id-3420130.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Redis与Memcached的比较的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP中的常见魔术方法功能作用及用法实例
- 下一篇: 数据库中查询记录时是否每次只能使用一个索