共計 1546 個字符,預計需要花費 4 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這篇文章主要介紹了 redis 單線程執行速度這么快的原因,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓丸趣 TV 小編帶著大家一起了解一下。
Redis 之所以執行速度很快,主要依賴于以下幾個原因:
(一) 純內存操作,避免大量訪問數據庫,減少直接讀取磁盤數據,redis 將數據儲存在內存里面,讀寫數據的時候都不會受到硬盤 I/O 速度的限制,所以速度快;
(二) 單線程操作,避免了不必要的上下文切換和競爭條件,也不存在多進程或者多線程導致的切換而消耗 CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導致的性能消耗;
(三) 采用了非阻塞 I / O 多路復用機制
多路復用原理:
用戶首先將需要進行 IO 操作的 socket 添加到 select 中,然后阻塞等待 select 系統調用返回。當數據到達時,socket 被激活,select 函數返回。用戶線程正式發起 read 請求,讀取數據并繼續執行。這樣用戶可以注冊多個 socket,然后不斷地調用 select 讀取被激活的 socket,redis 服務端將這些 socke 置于隊列中,然后,文件事件分派器,依次去隊列中取,轉發到不同的事件處理器中,提高讀取效率。
采用多路 I/O 復用技術可以讓單個線程高效的處理多個連接請求(盡量減少網絡 IO 的時間消耗),多路 I / O 復用模型是利用 select、poll、epoll 可以同時監察多個流的 I/O 事件的能力,在空閑的時候,會把當前線程阻塞掉,當有一個或多個流有 I/O 事件時,就從阻塞態中喚醒,于是程序就會輪詢一遍所有的流(epoll 是只輪詢那些真正發出了事件的流),并且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作,從而提高效率。
(四)靈活多樣的數據結構。
redis 內部使用一個 redisObject 對象來表示所有的 key 和 value。redisObject 主要的信息包括數據類型、編碼方式、數據指針、虛擬內存等。它包含 String,Hash,List,Set,Sorted Set 五種數據類型,針對不同的場景使用對應的數據類型,減少內存使用的同時,節省網絡流量傳輸。
(五)持久化
由于 redis 的數據都存放在內存中,如果沒有配置持久化,redis 重啟后數據就全丟失了,于是需要開啟 redis 的持久化功能,將數據保存到磁盤上,當 redis 重啟后,可以從磁盤中恢復數據。redis 提供兩種方式進行持久化,一種是 RDB 持久化(原理是將 redis 在內存中的數據庫記錄定時 dump 到磁盤上的 RDB 持久化),另外一種是 AOF(append only file)持久化(原理是將 redis 的操作日志以追加的方式寫入文件)。持久化似乎和 redis 的速度快并沒有直接關系,但是這保證的 redis 數據的安全性和可靠性,也起到數據備份的作用。
(六)總結
試想單線程是否就無法發揮多核 CPU 性能,其實不然,我們可以通過在單機開多個 redis 實例來完善。單一線程只能用到一個 CPU 核心,所以可以在同一個多核的服務器中,啟動多個實例,組成 master-master 或者 master-slave 的形式,耗時的讀命令可以完全在 slave 進行,充分發揮 redis 的作用。
單線程指的是網絡請求模塊使用了一個線程(所以不需考慮并發安全性),其他模塊也會用到多個線程,使用 redis 的過程中充分發揮其優勢,避免一些不當操作,導致性能下降。
感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享 redis 單線程執行速度這么快的原因內容對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,遇到問題就找丸趣 TV,詳細的解決方法等著你來學習!
向 AI 問一下細節丸趣 TV 網 – 提供最優質的資源集合!