日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Redis時單線程設計的,為什么還這么快

作者:l1050188952 更新時間: 2022-09-25 編程語言

單線程設計的考慮

Redis采用單線程好處在于避免了多線程對數據競爭的問題,加鎖的問題,上下文切換的問題。據官方解釋,redis的瓶頸不在cpu,而在內存或者網絡的帶寬,綜合考慮然后就采用了單線程。(Redis的性能非常高,每秒可以承受10W+的QPS,因為大部分操作在內存中,采用的IO多路復用機制)這里說的單線程是指處理網絡請求時只是用一個線程,redis本身在持久化的時候還是會用到額外的線程的。

到了Redis4.0開始也支持了多線程,當然只是針對部分命令采用的是多線程,例如:UNLINK(對刪除操作懶處理)、FLUSHALL (清理數據庫)、ASYNC(異步化)等。引入這些的目的是:在某些情況下,盡可能的提升效率,假設有一個key大到幾十M,這時DEL這個key的時候,可能會短暫的阻塞,這時如果用unlink來刪除,剛開始只是刪除這個key,真正的value是后臺線程去刪除的。

內存操作和IO多路復用機制

Redis?是基于內存的數據庫,本身數據就存在于內存里,這個過程不會受到磁盤?I/O?的限制。

IO多路復用的意思就是多個網路IO即為多個TCP連接復用一個進程或者線程,這種模型最大的好處就是不用為每個連接創建一個進程或者線程。比較經典的模型就是 select、poll、epoll

select:select(fds),一次性把fds交給內核,然后內核告訴哪些fd可讀可寫(內核自己遍歷,而不用用戶遍歷,將多次的系統調用變成1次系統調用)。fds最大是1024,這也決定了select模型最大并發是1024。

poll:和select差不多,只不過并發不止1024了,可以更多

epoll:?select和poll的缺點是內核遍歷的時間復雜度是O(n),雖然用戶不用遍歷了,減少了陷入內核的次數,但是內核還是要遍歷的。epoll的優點就是內核也不需要遍歷,當用戶把fds傳給內核時,會依賴硬件中斷,比如當網卡有數據到來時,就會中斷告訴cpu,cpu就知道哪個fd有數據到達了。

Redis采用了非阻塞的IO多路復用(redis默認采用epoll,除非系統不支持)技術。redis本身就是一個事件驅動程序,redis把socket抽象成文件事件。這里說的IO多路復用就是文件事件處理器以單線程的方式,來監聽相關的套接字,應對大量的請求,Redis?中使用?I/O?多路復用程序同時監聽多個套接字,并將這些事件推送到一個隊列里,然后逐個被執行。最終將結果返回給客戶端(accept、read、write、close)。由于IO多路復用程序是一個單線程,那么當多個socket到來時,肯定要排隊,它們總是以隊列的方式順序地處理。

? ? ? ? 使用過程中,采用單線程的缺點很明顯,無法使用多核CPU。Redis作者提到,由于Redis的大部分操作并不是CPU密集型任務,而Redis的瓶頸在于內存和網絡帶寬。在高并發請求下,Redis需要更多的內存和更高的網絡帶寬,否則瓶頸很容易出現在內存不夠用和網絡延遲等待的情況。

????????單個的Redis是單線程,采用了線程封閉的方式,把任務封閉在一個線程,避免了線程安全問題,不過對于需要依賴多個?Redis?操作(即多個?Redis?操作命令)的復合操作來說,依然需要鎖,而且有可能是分布式鎖。

原文鏈接:https://blog.csdn.net/l1050188952/article/details/126536657

欄目分類
最近更新