我們們一起來談談,redis為什麼快?

楊士超發表於2017-03-21

      在程式媛的生涯中,設定快取會想起它,控制併發會想到它,做一些壓縮儲存依舊會想到它,一直停留在知道的起點上,但是沒有深入的去挖掘和總結它這麼受歡迎的原因。近期天時地利人和,整理了一下它的點點滴滴。

☁  和Memcached一較高低

     記得前幾年,專案中比較常用的還是Memcached,儲存影象、視訊,搭建叢集也是樣樣都行。但是隨著redis的發展,redis慢慢的融入到專案中,開始佔有一席之地。但是與成熟的Memcached並肩前行,redis雖然是新興的,但是Memcached依舊有redis不可替代的適用場景:

      第一個場景:儲存一些粒度比較小的靜態資料,比如一些html片段,Memcached便是我們更好的選擇。相對於redis而言,Memcached的後設資料metadata更小些,所以相對來講對於資料儲存管理的效能更高,額外開銷更小。

     Memcached唯一支援的資料型別是String,所以更適合儲存只讀資料,因為字串並不會因為額外的處理造成額外的開銷。畢竟Memcached每次更新一個物件時,都需要重複執行下面的操作:獲取整個字串->反序列化為物件->修改其中的值->再次序列化該物件->在快取中將整個字串替換為新字串。這樣一來,更新儲存資料就會有更高的消耗,可能就不是我們的最佳選擇了。      

      第二個場景:比redis更容易水平擴充套件。具體的擴充套件方式請參見:點選開啟連結

☁  Redis的優勢

✎  快取管理:可以在必要時將無效的舊資料從記憶體中刪除,為新資料騰出新的空間(過期的key的三種清理策略)。

✎  提供更大的靈活性:redis支援多種型別,並且採用key-value 的形式儲存,key和value的大小限制都是512Mb,與編碼無關,所以資料安全。但是memcached限制key最大為250位元組,value為1MB,況且只支援String型別。Redis通過Hash來儲存一個物件的欄位和值,並且可以通過單個key來管理它們(設定值,設定過期時間),而且我們可以很方便的通過Linux命令或者redis-cli完成對key的管理。

✎  redis提供主從複製:實現高可用的cache系統,支援叢集中多個伺服器之間的資料同步。

✎  資料持久化:redis可以通過兩種方式將資料進行持久化,一定程度上規避快取中的資料不穩定的問題,也可以在重啟伺服器時最快的恢復快取中所需的資料,提高了效率的同事減輕了主資料庫系統的開銷。

 ☁   Redis為什麼會快?

✎  完全基於記憶體

      Redis是純記憶體資料庫,相對於讀寫磁碟,讀寫記憶體的速度就不是幾倍幾十倍了,一般,hash查詢可以達到每秒百萬次的數量級。

✎  多路複用IO

      “多路”指的是多個網路連線,“複用”指的是複用同一個執行緒。採用多路 I/O 複用技術可以讓單個執行緒高效的處理多個連線請求(儘量減少網路IO的時間消耗)。可以直接理解為:單執行緒的原子操作,避免上下文切換的時間和效能消耗;加上對記憶體中資料的處理速度,很自然的提高redis的吞吐量。

      對於Redis的內部實現和原始碼設計還在進一步研究,有新的理解和心得會及時在這裡跟大家一起分享哦!


相關文章