淺談 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角度來說,redis選用的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當數據庫用!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章