為什么Redis緩存速度這么快?


 


 首先介紹下硬盤數據庫和Redis的工作模式

一、硬盤數據庫的工作模式:

 

 

 

需要先從數據讀取數據到內存,內存中的數據保存到硬盤,我們更改硬盤的數據后在保存到數據庫。這里的步驟較多,而且還占用我們的硬盤容量。

二、內存數據庫的工作模式:

 

 

這種方式相比硬盤數據庫的方式少了內存到硬盤這一步,速度回快很多,而且不占用我們的硬盤容量。我們用的Redis就是基於這種方式的,看完Redis簡介(一)和上面的描述,我們對於Redis有了一定的了解。下面我們再介紹Redis作為緩存為什么速度這么快。

三、Redis到底有多快

Redis采用的是基於內存的采用的是單進程單線程模型的 KV 數據庫,由C語言編寫,官方提供的數據是可以達到100000+的QPS(每秒內查詢次數)。這個數據不比采用單進程多線程的同樣基於內存的 KV 數據庫 Memcached 差!有興趣的可以參考官方的基准程序測試:https://redis.io/topics/benchmarks

 

橫軸是連接數,縱軸是QPS。此時,這張圖反映了一個數量級,希望大家在面試的時候可以正確的描述出來,不要問你的時候,你回答的數量級相差甚遠!

四、Redis為什么這么快

1、完全基於內存,絕大部分請求是純粹的內存操作,非常快速。數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間復雜度都是O(1);

2、數據結構簡單,對數據操作也簡單,Redis中的數據結構是專門進行設計的;

3、采用單線程,避免了不必要的上下文切換和競爭條件,也不存在多進程或者多線程導致的切換而消耗 CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導致的性能消耗;

4、使用多路I/O復用模型,非阻塞IO;

5、使用底層模型不同,它們之間底層實現方式以及與客戶端之間通信的應用協議不一樣,Redis直接自己構建了VM 機制 ,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求;

以上幾點都比較好理解,下邊我們針對多路 I/O 復用模型進行簡單的探討:

(1)多路 I/O 復用模型

多路I/O復用模型是利用 select、poll、epoll 可以同時監察多個流的 I/O 事件的能力,在空閑的時候,會把當前線程阻塞掉,當有一個或多個流有 I/O 事件時,就從阻塞態中喚醒,於是程序就會輪詢一遍所有的流(epoll 是只輪詢那些真正發出了事件的流),並且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作。

這里“多路”指的是多個網絡連接,“復用”指的是復用同一個線程。采用多路 I/O 復用技術可以讓單個線程高效的處理多個連接請求(盡量減少網絡 IO 的時間消耗),且 Redis 在內存中操作數據的速度非常快,也就是說內存內的操作不會成為影響Redis性能的瓶頸,主要由以上幾點造就了 Redis 具有很高的吞吐量。

 

原文鏈接:https://blog.csdn.net/weixin_42189604/java/article/details/82703391


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM