Redis單線程架構


 

參考鏈接:

  http://blog.csdn.net/qqqqq1993qqqqq/article/details/77538202

單線程模型:

  redis中的數據結構並不全是簡單的kv,還有list、hash等復雜的結構,這些結構很可能會進行細粒度的操作,比如在很長的列表偶棉添加一個元素,在hash當中或者刪除一個對象,這樣的一個操作就會添加很多的鎖,導致同步的開銷大大增加,redis權衡之后選擇使用單線程,突出自己功能的靈活性,在單線程基礎上任何原子操作都可以無代價的實現,多復雜的數據結構都可以輕松運用

  Redis客戶端對服務端的每次調用都經歷了發送命令、執行命令、返回結果三個過程,其中執行命令階段,由於redis是單線程來處理命令的,所以每一條到達服務端的命令不會立即執行,所有的命令都會進入一個隊列中,然后逐個被執行,並且多個客戶端發送的命令的執行順序是不確定的,但是可以確定的是不會有兩個命令被同時執行,不會產生並發問題,這就是redis的單線程基本模型

  單線程模型每秒萬級別處理能力的原因:

    1 純內存訪問,數據存放在內存中,內存的響應時間大約是100ns,這是redis每秒萬級別訪問的重要基礎

    2 非阻塞I/O,redis采用epoll作為I/O多路復用技術的實現,再加上redis自身的事件處理模型將epoll中的連接、讀寫、關閉都轉換為了時間,不在I/O上浪費過多的時間

    3 單線程避免了線程切換和競態產生的消耗

    4 redis采用單線程模型,每條命令執行如果占用大量時間,會造成其他線程的阻塞,對於redis這種高性能服務是致命的,所以redis是面向高速執行的數據

Redis常見問題:

Redis為什么是單線程的?

  因為CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機器內存或者網絡帶寬,既然單線程容易實現,而且CPU不會成為瓶頸,那就順便成章的采用單線程的方案

如果萬一CPU成為你的Redis瓶頸了,或者,你就是不想讓服務器其他核閑置,那怎么辦?

  那也很簡單,你多起幾個Redis進程就好了。Redis是keyvalue數據庫,又不是關系數據庫,數據之間沒有約束。只要客戶端分清哪些key放在哪個Redis進程上就可以了。redis-cluster可以幫你做的更好

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM