對redis高可用、高併發、高性能的理解

概述

之前對“高性能、高可用、高併發”,只知其名不知其意,直到在知乎上看到redis系列文章,才豁然開朗,對redis三高可以這麼理解。

說明

  • 高性能,指的是查詢快。
    • redis是c語言實現,與其他語言相比,在實現語言層面性能高;redis是內存數據庫,而傳統的關係型數據庫是磁盤文件讀寫,所以redis讀寫快;單線程,無上下文切換損耗,也不需要線程間同步,在單核cpu上,性能高,如果服務器是多核cpu,可以開啓多個進程的單線程redis實例;基於以上原因,才達到了官網所說的,即使pc都支持QPS>10w/s的查詢。
  • 高可用(High Availability),高可用指的是在節點故障時,服務仍然能正常運行或者進行降級後提供部分服務;
    • 單點redis,redis是內存數據庫,在遇到斷電或者重啓時,數據能恢復嗎?當然能。redis提供了兩種持久化方式AOF/RDB,AOF是Append Of File,redis的修改命令(hset、set)會寫入文件中,在恢復數據時,從頭執行一遍命令就恢復了數據了,這種數據最全,但是恢復時間長。RDB是Redis DataBase,redis會定時備份數據,這是默認的持久化方式,但是因爲是定時備份所有數據會有部分缺失。
    • master-slave,如果單點redis遇到故障怎麼辦?redis提供master-slave/sentinel/cluster高可用方案,master-slave是常見的複製(Replication) 方案,一個master,多個slave,就是俗稱的主從複製,master用來接收請求,slave備份master數據,冗餘了數據,但master-slave有個缺點,master 故障後,slave不會自動切換爲master,必須人爲干預,sentinel就是用來解決這個問題的
    • sentinel,這種方案在master-slave的基礎上,多了sentinel[ˈsentɪnl],sentinel漢語意思是哨兵,哨兵監測master及所有的slave狀態(心跳),如果master故障,sentinel會組織slave選舉新的master,並通知客戶端,從而實現可用性,但是單master畢竟能力有限(查詢最大10w/s),如果超過這個極限,怎麼辦?我們會想,如果有多個master就好了,這就是集羣
  • 高併發,redis cluster
    • redis集羣有2個TCP 端口,一個用來伺服客戶端,比如常見的6379,另外一個對6379+10000=16379,作爲“high”端口,high端口用來節點間通信、失敗監測、故障轉移授權、配置更新,high端口與數據端口差值必須是固定的10000。redis集羣對數據做了分片,redis數據分片沒有采用一致性哈希(consistent hash),而是使用了hash slot,redis集羣一共有16384(2的14次方)個槽,key對16384取模分配,比如A、B、C三個節點,
      節點A 哈希槽( 0 ~ 5500)
      節點 B 哈希槽(5501 ~ 11000)
      節點 C哈希槽( 11001 ~ 16383)
      增加節點D,那麼就要將A、B、C的部分數據遷移到D上;如果刪除A,那就要將A的數據遷移到B、C上,然後才能完全刪除A。爲了增加可用性,每個節點使用主從複製,比如A1、B1、C1,當B節點故障時,集羣會將B1設置爲新master,當B1也故障時,集羣就真down了。

總結

如果理解了redis的高可用、高性能、高併發,那麼其他組件的三高也容易理解了,比如mysql的主從複製就是爲了高可用、如果主從複製讀寫分離那麼又多滿足了一項–高性能,同時也有高併發的提升。平時,得多思考,保持一顆敏感的心。

9年全棧開發經驗,請關注個人公衆號

在這裏插入圖片描述

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