首頁  >  文章  >  資料庫  >  redis是多線程的嗎

redis是多線程的嗎

尚
原創
2019-06-28 17:27:223359瀏覽

redis是多線程的嗎

redis是單線程,單線程指的是網路請求模組使用了一個線程(所以不需要考慮並發安全性),即一個線程處理所有網路請求,其他模組仍用了多個線程。

redis可以能夠快速執行的原因:

(1) 絕大部分請求是純粹的記憶體操作(非常快速)
(2) 採用單一執行緒,避免了不必要的上下文切換和競爭條件
(3) 非阻塞IO-IO多路復用(IO多路復用是什麼意思?)

IO多路復用中有三種方式:select,poll,epoll。需要注意的是,select,poll是線程不安全的,epoll是線程安全的

redis內部實作採用epoll,採用了epoll 自己實作的簡單的事件框架。 epoll中的讀、寫、關閉、連接都轉化成了事件,然後利用epoll的多路復用特性,絕不在io上浪費一點時間這3個條件不是相互獨立的,特別是第一條,如果請求都是耗時的,採用單執行緒吞吐量及效能可想而知了。應該說redis為特殊的場景選擇了合適的技術方案。

redis的內部實作:

內部實作採用epoll,採用了epoll 自己實作的簡單的事件框架。 epoll中的讀、寫、關閉、連接都轉化成了事件,然後利用epoll的多路復用特性,絕不在io上浪費一點時間這3個條件不是相互獨立的,特別是第一條,如果請求都是耗時的,採用單執行緒吞吐量及效能可想而知了。應該說redis為特殊的場景選擇了合適的技術方案。

Redis關於線程安全問題:

redis實際上是採用了線程封閉的觀念,把任務封閉在一個線程,自然避免了線程安全問題,不過對於需要依賴多個redis操作的複合操作來說,依然需要鎖,而且有可能是分散式鎖。

使用Redis有哪些好處?

(1) 速度快,因為資料存在記憶體中,類似HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1)

(2) 支援豐富資料類型,支援string,list,set,sorted set,hash

(3) 支援事務,操作都是原子性,所謂的原子性就是對資料的變更要麼全部執行,要麼全部不執行

(4) 豐富的功能:可用於緩存,訊息,按key設定過期時間,過期後將會自動刪除

Redis常見效能問題和解決方案:

(1) Master最好不要做任何持久化工作,如RDB記憶體快照和AOF日誌檔案;(Master寫記憶體快照,save指令調度rdbSave函數,會阻塞主執行緒的工作,當快照比較大時對效能影響是非常大的,會間斷性暫停服務,所以Master最好不要寫內存快照;AOF檔案過大會影響Master重啟的恢復速度)

(2) 如果資料比較重要,某個Slave開啟AOF備份數據,策略設定為每秒同步一次

(3) 為了主從複製的速度和連接的穩定性,Master和Slave最好在同一個區域網路內

(4) 盡量避免在壓力很大的主庫上增加從庫

(5) 主從複製不要用圖狀結構,用單向鍊錶結構更為穩定,即:Master <- Slave1 <- Slave2 <- Slave3...;這樣的結構方便解決單點故障問題,實現Slave對Master的替換。如果Master掛了,可以立刻啟用Slave1做Master,其他不變。

更多Redis相關知識,請造訪Redis使用教學欄位!

以上是redis是多線程的嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn