參考鏈接:
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可以幫你做的更好