- 基于內存:Redis 將數據存儲在內存中,內存訪問速度遠高于磁盤訪問速度,因此能夠快速讀寫數據。
- 單線程模型:Redis 使用單線程模型來處理客戶端請求,避免了多線程之間的切換開銷,簡化了并發控制,提高了數據處理速度。
- 多路復用IO:Redis 使用非阻塞 I/O 處理網絡請求,可以處理大量并發連接而不會造成線程阻塞,提高了網絡通信效率。
多路復用IO原理:
????????多路復用(Multiplexing)IO 是一種利用操作系統提供的機制同時監控多個文件描述符(sockets)的技術,通過一種非阻塞的方式實現對多個 IO 操作的復用,提高系統的 IO 操作效率。多路復用主要采用 select、poll、epoll 等系統調用來實現,這些調用可以同時監視多個文件描述符的可讀、可寫、異常等事件。
多路復用的基本原理包括以下幾個步驟:
- 注冊文件描述符:應用程序向操作系統內核注冊多個文件描述符,告訴內核要監視的文件描述符和監視的事件類型。
- 阻塞等待:應用程序調用多路復用的系統調用(如 select、poll、epoll_wait)并進入阻塞等待狀態,等待有任何一個注冊的文件描述符發生事件(可讀、可寫等)。
- 事件觸發:一旦有文件描述符上發生了監視的事件,內核將喚醒應用程序,返回就緒文件描述符的信息。
- 處理事件:應用程序通過輪詢返回的就緒文件描述符集合,逐一處理每個就緒文件描述符上發生的事件,進行相應的 IO 操作。
select、poll、epoll 的區別:
select、poll 和 epoll 都是在網絡編程中用于 I/O 復用的機制,它們的主要作用是在多個文件描述符中等待并檢測哪些文件描述符已經就緒可進行 I/O 操作。
select:
- select 是最古老的 I/O 復用函數之一,在 POSIX 標準中提供支持。
- 通過調用 select 函數,可以同時監視多個文件描述符,當其中任何一個文件描述符就緒時,select 函數會返回,并告知哪些文件描述符已經就緒。
- 有三個主要限制:文件描述符數量上限受限于 FD_SETSIZE 宏定義(通常為 1024),每次調用都需要將文件描述符集合從用戶態拷貝到內核態,效率較低,復雜度隨著文件描述符數量增加而增加。
poll:
- poll 是對 select 的改進,也用于實現 I/O 復用。
- 與 select 不同,poll 沒有文件描述符數量限制,使用對象是一個 pollfd 結構體數組。
- 調用 poll 函數時,內核會遍歷所有的 pollfd 結構體,找出其中已經就緒的文件描述符,并返回。
- 雖然解決了 select 的文件描述符數量限制問題,但效率依然不高,因為每次調用 poll 都需要將 pollfd 結構體數組從用戶態拷貝到內核態。
epoll:
- epoll 是 Linux 特有的 I/O 復用機制,相比于 select 和 poll 更加高效。
- epoll 使用一組事件管理文件描述符,無需將文件描述符從用戶態拷貝到內核態,因此效率更高。
- 通過調用 epoll_create 創建 epoll 實例,然后使用 epoll_ctl 向 epoll 實例中添加、修改或刪除需要關注的文件描述符,最后調用 epoll_wait 等待文件描述符就緒。
- epoll 支持水平觸發和邊緣觸發兩種模式,可以更靈活地處理事件
ps:以下是我整理的java面試資料,密碼是obht,感興趣的可以看看。最后,創作不易,覺得寫得不錯的可以點點關注!
鏈接:https://www.yuque.com/u39298356/uu4hxh?# 《Java面試寶典》?