Redis與Memcached的比較

2021-06-19 00:48:51 字數 1398 閱讀 5438

redis與memcached的比較

網路io模型 memcached是多執行緒,非阻塞io復用的網路模型,分為監聽主線程和worker子執行緒,監聽執行緒監聽網路連線,接受請求後,將連線描述字pipe 傳遞給worker執行緒,進行讀寫io, 網路層使用libevent封裝的事件庫,多執行緒模型可以發揮多核作用,但是引入了cache coherency和鎖的問題,比如,memcached最常用的stats 命令,實際memcached所有操作都要對這個全域性變數加鎖,進行計數等工作,帶來了效能損耗。

(memcached網路io模型)

redis使用單執行緒的io復用模型,自己封裝了乙個簡單的aeevent事件處理框架,主要實現了epoll、kqueue和select,對於單純只有io操作來說,單執行緒可以將速度優勢發揮到最大,但是redis也提供了一些簡單的計算功能,比如排序、聚合等,對於這些操作,單執行緒模型實際會嚴重影響整體吞吐量,cpu計算過程中,整個io排程都是被阻塞住的。

記憶體管理方面 memcached使用預分配的記憶體池的方式,使用slab和大小不同的chunk來管理記憶體,item根據大小選擇合適的chunk儲存,記憶體池的方式可以省去申請/釋放記憶體的開銷,並且能減小記憶體碎片產生,但這種方式也會帶來一定程度上的空間浪費,並且在記憶體仍然有很大空間時,新的資料也可能會被剔除,原因可以參考timyang的文章:

redis使用現場申請記憶體的方式來儲存資料,並且很少使用free-list等方式來優化記憶體分配,會在一定程度上存在記憶體碎片,redis跟據儲存命令引數,會把帶過期時間的資料單獨存放在一起,並把它們稱為臨時資料,非臨時資料是永遠不會被剔除的,即便物理記憶體不夠,導致swap也不會剔除任何非臨時資料(但會嘗試剔除部分臨時資料),這點上redis更適合作為儲存而不是cache。

資料一致性問題 memcached提供了cas命令,可以保證多個併發訪問操作同乙份資料的一致性問題。 redis沒有提供cas 命令,並不能保證這點,不過redis提供了事務的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷。

儲存方式及其它方面 memcached基本只支援簡單的key-value儲存,不支援列舉,不支援持久化和複製等功能

redis除key/value之外,還支援list,set,sorted set,hash等眾多資料結構,提供了keys

關於不同語言的客戶端支援 在不同語言的客戶端方面,memcached和redis都有豐富的第三方客戶端可供選擇,不過因為memcached發展的時間更久一些,目前看在客戶端支援方面,memcached的很多客戶端更加成熟穩定,而redis由於其協議本身就比memcached複雜,加上作者不斷增加新的功能等,對應第三方客戶端跟進速度可能會趕不上,有時可能需要自己在第三方客戶端基礎上做些修改才能更好的使用。

根據以上比較不難看出,當我們不希望資料被踢出,或者需要除key/value之外的更多資料型別時,或者需要落地功能時,使用redis比使用memcached更合適。

Redis與Memcached的比較

1.網路io模型 memcached是多執行緒,非阻塞io復用的網路模型,分為監聽主線程和worker子執行緒,監聽執行緒監聽網路連線,接受請求後,將連線描述字pipe 傳遞給worker執行緒,進行讀寫io,網路層使用libevent封裝的事件庫,多執行緒模型可以發揮多核作用,但是引入了cache...

Redis與Memcached的比較

redis與memcached的比較 1.網路io模型 memcached是多執行緒,非阻塞io復用的網路模型,分為監聽主線程和worker子執行緒,監聽執行緒監聽網路連線,接受請求後,將連線描述字pipe 傳遞給worker執行緒,進行讀寫io,網路層使用libevent封裝的事件庫,多執行緒模型...

Redis與Memcached的區別

傳統mysql memcached架構遇到的問題 實際mysql是適合進行海量資料儲存的,通過memcached將熱點資料載入到cache,加速訪問,很多公司都曾經使用過這樣的架構,但隨著業務資料量的不斷增加,和訪問量的持續增長,我們遇到了很多問題 1.mysql需要不斷進行拆庫拆表,memcach...