Redis工作系列之一 與 Memcached對比理解

     近期公司項目在使用Redis,這Redis很火,Redis也常常被當作Memcached的挑戰者被提到桌面上來。關於Redis與Memcached的比較更是比比皆是。然而,Redis真的在功能、性能以及內存使用效率上都超越了Memcached嗎?



  • You should not care too much about performances. Redis is faster per core with small values, but memcached is able to use multiple cores with a single executable and TCP port without help from the client. Also memcached is faster with big values in the order of 100k. Redis recently improved a lot about big values (unstable branch) but still memcached is faster in this use case. The point here is: nor one or the other will likely going to be your bottleneck for the query-per-second they can deliver.

  • 沒有必要過多的關心性能,因爲二者的性能都已經足夠高了。由於Redis只使用單核,而Memcached可以使用多核,所以在比較上,平均每一個核上Redis在存儲小數據時比Memcached性能更高。而在100k以上的數據中,Memcached性能要高於Redis,雖然Redis最近也在存儲大數據的性能上進行優化,但是比起Memcached,還是稍有遜色。說了這麼多,結論是,無論你使用哪一個,每秒處理請求的次數都不會成爲瓶頸。(比如瓶頸可能會在網卡)



  • You should care about memory usage. For simple key-value pairs memcached is more memory efficient. If you use Redis hashes, Redis is more memory efficient. Depends on the use case.
  • 如果要說內存使用效率,使用簡單的key-value存儲的話,Memcached的內存利用率更高,而如果Redis採用hash結構來做key-value存儲,由於其組合式的壓縮,其內存利用率會高於Memcached。當然,這和你的應用場景和數據特性有關。


  • You should care about persistence and replication, two features only available in Redis. Even if your goal is to build a cache it helps that after an upgrade or a reboot your data are still there.
  • 如果你對數據持久化和數據同步有所要求,那麼推薦你選擇Redis,因爲這兩個特性Memcached都不具備。即使你只是希望在升級或者重啓系統後緩存數據不會丟失,選擇Redis也是明智的。


  • You should care about the kind of operations you need. In Redis there are a lot of complex operations, even just considering the caching use case, you often can do a lot more in a single operation, without requiring data to be processed client side (a lot of I/O is sometimes needed). This operations are often as fast as plain GET and SET. So if you don’t need just GEt/SET but more complex things Redis can help a lot (think at timeline caching).
  • 當然,最後還得說到你的具體應用需求。Redis相比Memcached來說,擁有更多的數據結構和並支持更豐富的數據操作,通常在Memcached裏,你需要將數據拿到客戶端來進行類似的修改再set回去。這大大增加了網絡IO的次數和數據體積。在Redis中,這些複雜的操作通常和一般的GET/SET一樣高效。所以,如果你需要緩存能夠支持更復雜的結構和操作,那麼Redis會是不錯的選擇。


Redis是什麼?兩句話可以做下概括: 

1. 是一個完全開源免費的key-value內存數據庫 
2. 通常被認爲是一個數據結構服務器,主要是因爲其有着豐富的數據結構 strings、map、 list、sets、 sorted sets

 

Redis不是什麼?同樣從兩個方面來做下對比: 

1. 不是sql server、mySQL等關係型數據庫,主要原因是: 
     . redis目前還只能作爲小數據量存儲(全部數據能夠加載在內存中) ,海量數據存儲方面並不是redis所擅長的領域 
     . 設計、實現方法很不一樣.關係型數據庫通過表來存儲數據,通過SQL來查詢數據。而Redis通上述五種數據結構來存儲數據,通過命令 來查詢數據


2.   不是Memcached等緩存系統,主要原因有以下幾個:


     .網絡IO模型方面:Memcached是多線程,分爲監聽線程、worker線程,引入鎖,帶來了性能損耗。Redis使用單線程的IO複用模型,將速度優勢發揮到最大,也提供了較簡單的計算功能


     .內存管理方面:Memcached使用預分配的內存池的方式,帶來一定程度的空間浪費 並且在內存仍然有很大空間時,新的數據也可能會被剔除,而Redis使用現場申請內存的方式來存儲數據,不會剔除任何非臨時數據 Redis更適合作爲存儲而不是cache


     .數據的一致性方面:Memcached提供了cas命令來保證.而Redis提供了事務的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷


     . 存儲方式方面:Memcached只支持簡單的key-value存儲,不支持枚舉,不支持持久化和複製等功能

   一句話小結一下:Redis是一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部分場合可以對關係數據庫起到很好的補充作用。

 

Redis有什麼用?只有瞭解了它有哪些特性,我們在用的時候才能揚長避短,爲我們所用


1. 速度快:使用標準C寫,所有數據都在內存中完成,讀寫速度分別達到10萬/20萬


2. 持久化:對數據的更新採用Copy-on-write技術,可以異步地保存到磁盤上,主要有兩種策略,一是根據時間,更新次數的快照(save 300 10 )二是基於語句追加方式(Append-only file,aof)


3. 自動操作:對不同數據類型的操作都是自動的,很安全


4. 快速的主--從複製,官方提供了一個數據,Slave在21秒即完成了對Amazon網站10G key set的複製。

 
5. Sharding技術: 很容易將數據分佈到多個Redis實例中,數據庫的擴展是個永恆的話題,在關係型數據庫中,主要是以添加硬件、以分區爲主要技術形式的縱向擴展解決了很多的應用場景,但隨着web2.0、移動互聯網、雲計算等應用的興起,這種擴展模式已經不太適合了,所以近年來,像採用主從配置、數據庫複製形式的,Sharding這種技術把負載分佈到多個特理節點上去的橫向擴展方式用處越來越多。

 

對Redis數據庫做下小結:


    1. 提高了DB的可擴展性,只需要將新加的數據放到新加的服務器上就可以了 
    2. 提高了DB的可用性,隻影響到需要訪問的shard服務器上的數據的用戶 
    3. 提高了DB的可維護性,對系統的升級和配置可以按shard一個個來搞,對服務產生的影響較小 
    4. 小的數據庫存的查詢壓力小,查詢更快,性能更好

 

RedisMemcached的比較

    1.Memcached是多線程,而Redis使用單線程.

    2.Memcached使用預分配的內存池的方式,Redis使用現場申請內存的方式來存儲數據,並且可以配置虛擬內存。

    3.Redis可以實現持久化,主從複製,實現故障恢復。

    4.Memcached只是簡單的keyvalue,但是Redis支持數據類型比較多。


 

 

    Redis爲單進程單線程模式,採用隊列模式將併發訪問變爲串行訪問。Redis本身沒有鎖的概念,Redis對於多個客戶端連接並不存在競爭..redis是個單線程的程序,爲什麼會這麼快呢?

    1、大量線程導致的線程切換開銷。
    2、鎖。
    3、非必要的內存拷貝。

    4. Redis多樣的數據結構,每種結構只做自己愛做的事.

   

    Hash對應的Value內部實際就是一個HashMap,實際這裏會有2種不同實現,這個HashMap的成員比較少時,Redis爲了節省內存會採用類似一維數組的方式來緊湊存儲,而不會採用真正的HashMap結構,當成員量增大時會自動轉成真正的HashMap.


總結:


 要進行Master-slave配置,出現服務故障時可以支持切換。 
   在master側禁用數據持久化,只需在slave上配置數據持久化。 
     物理內存+虛擬內存不足,這個時候dump一直死着,時間久了機器掛掉。這個情況就是災難! 
       當Redis物理內存使用超過內存總容量的3/5時就會開始比較危險了,就開始做swap,內存碎片大 
         當達到最大內存時,會清空帶有過期時間的key,即使key未到過期時間. 
            redis與DB同步寫的問題,先寫DB,後寫redis,因爲寫內存基本上沒有問題



發佈了249 篇原創文章 · 獲贊 92 · 訪問量 190萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章