redis和Memcached的區別,都什麼時候使用?
快取在網際網路公司佔得比例還是蠻大的,提到快取呢,就一定會想到redis和memcache,現在絕大多數的公司呢,都是推薦使用redis,這是為什麼呢,而使用memcache也不在少數,所以redis和memcache之間到底有什麼區別,在什麼場景下選擇redis,什麼場景下選擇memcache呢?
redis和memcache這兩個作為目前市面上最火的兩款快取,存在即合理,雖然redis有了很多memcache不存在的功能,但是想要完全取代memcache,是很難的。他們之前的共同點肯定是在記憶體中儲存資料,防止高併發影響資料庫效能,減少資料庫壓力,並提高查詢速度,巴拉巴拉的一堆堆的,他們之前的區別到底是什麼呢?
從資料結構上來說,redis在kv模式上,支援5中資料結構,String、list、hash、set、zset,並支援很多相關的計算,比如排序、阻塞等,而memcache只支援kv簡單儲存。所以當你的快取中不只需要儲存kv模型的資料時,redis豐富的資料操作空間,絕對是非常好的選擇,另外說一句,利用redis可以高效的實現類似於單叢集下的阻塞佇列、鎖及執行緒通訊等功能。
從可靠性的角度來說,redis支援持久化,有快照和AOF兩種方式,而memcache是純的記憶體儲存,不支援持久化的。
從記憶體管理方面來說,redis也有自己的記憶體機制,redis採用申請記憶體的方式,會把帶過期時間的資料存放到一起,redis理論上能夠儲存比實體記憶體更多的資料,當資料超量時,會引發swap,把冷資料刷到磁碟上。而memcache把所有的資料儲存在實體記憶體裡。memcache使用預分配池管理,會提前把記憶體分為多個slab,slab又分成多個不等大小的chunk,chunk從最小的開始,根據增長因子增長記憶體大小。redis更適合做資料儲存,memcache更適合做快取,memcache在儲存速度方面也會比redis這種申請記憶體的方式來的快。
從資料一致性來說,memcache提供了cas命令,可以保證多個併發訪問操作同一份資料的一致性問題。 redis是序列操作,所以不用考慮資料一致性的問題。
從IO角度來說,選用的I/O多路複用模型,雖然單執行緒不用考慮鎖等問題,但是還要執行kv資料之外的一些排序、聚合功能,複雜度比較高。memcache也選用非阻塞的I/O多路複用模型,速度更快一些。
從執行緒角度來說,memcahce使用多執行緒,主執行緒listen,多個worker子執行緒執行讀寫,可能會出現鎖衝突。redis是單執行緒的,這樣雖然不用考慮鎖對插入修改資料造成的時間的影響,但是無法利用多核提高整體的吞吐量,只能選擇多開redis來解決。
從叢集方面來說,redis天然支援高可用叢集,支援主從,而memcache需要自己實現類似一致性hash的負載均衡演算法才能解決叢集的問題,擴充套件性比較低。
另外,redis集成了事務、複製、lua指令碼等多種功能,功能更全。redis功能這麼全,是不是什麼情況下都使用redis就行了呢?
非也,redis確實比memcache功能更全,整合更方便,但是memcache相比redis在記憶體、執行緒、IO角度來說都有一定的優勢,可以利用cpu提高機器效能,在不考慮擴充套件性和永續性的訪問頻繁的情況下,只儲存kv格式的資料,建議使用memcache,memcache更像是個快取,而redis更偏向與一個儲存資料的系統。但是,覺得不要拿redis當資料庫用!!!
歡迎關注訂閱微信公眾號,程式設計師的壓哨絕殺,一起分享生活工作中的見聞趣事。