redis和Memcached的區別,都什麼時候使用?
來自專欄程序員的壓哨絕殺1 人贊了文章
緩存在互聯網公司佔得比例還是蠻大的,提到緩存呢,就一定會想到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當資料庫用!!!
歡迎關注訂閱微信公眾號,程序員的壓哨絕殺,一起分享生活工作中的見聞趣事。
http://weixin.qq.com/r/ZDhYQD3E5WCarXkj9212 (二維碼自動識別)
?
推薦閱讀: