????????redis大家都知道擁有很高的性能,每秒可以支持上萬個請求,這里探討下它高性能的原理。單線程架構和io多路復用技術。
一,單線程架構
????????單線程架構指的是命令執行核心線程是單線程的,數據持久化、同步、異步刪除是其他線程在跑的。redis收到客戶端的命令是無序的,誰先來誰就先存起來,存到隊列中。然后走隊列依次取出命令執行。所以并不會產生并發問題。
? ? ? ? 那么為什么單線程反而很快呢?
? ? ? ? 1,純內存訪問肯定快。
? ? ? ? 2,不涉及多線程切換帶來的額外開銷。
二,io多路復用
? ? ? ? redis實現了reactor模型,利用linux的epoll機制實現了io多路復用的技術。
????????那為什么io多路復用技術就性能高呢?
????????因為io多路復用可以在一個監控線程里監聽很多連接,沒有io操作時只需要掛起監控線程,而不用掛起工作線程。只要有io操作事件到達時,就會喚起監聽線程進行處理,而不用輪訓判斷是否有數據到達。我們試想下并發的連接可能成千上萬,如果每個都開個線程處理系統肯定承受不了。就算用線程池,那么線程在阻塞等待時也什么都干不了,而且開幾百個線程頻繁切換性能也有問題。?
????????reactor模型有三個事件:連接事件,讀事件,寫事件。三個角色:reactor(反應者)、acceptor(接收者)、處理者。
reactor監聽事件,如果是連接事件則將事件分給acceptor。acceptor建立連接后創建處理器用于后續讀寫處理。如果是讀寫事件時則直接分給handler處理。
常見的慢操作
既然它是單線程架構,那么線程一旦阻塞就會導致后續操作變慢。
1,操作大對象的命令肯定慢。應該將數據拆分到多個key中。
2,keys、sort命令會進行較大計算,會導致阻塞。
3,一些批量操作的命令應該謹慎使用,會導致去多節點取數據,也比較耗時。