網站首頁 編程語言 正文
單線程設計的考慮
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
相關推薦
- 2023-07-09 【elementplus】解決el-table開啟show-overflow-tooltip后,to
- 2022-09-26 Redis刪除策略的三種方法及逐出算法_Redis
- 2023-05-23 numpy數組之讀寫文件的實現_python
- 2022-04-18 啟動項目: getaddrinfo ENOTFOUND localhost
- 2022-10-31 .Net中的Http請求調用詳解(Post與Get)_實用技巧
- 2022-04-08 python?selenium保存圖片最好的兩種方法_python
- 2022-11-14 python流程控制語句
- 2022-02-17 Pytorch常用的對象類和繼承機制(如果有)
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支