Redis為什麼那麼快

2021-09-25 17:30:18 字數 1729 閱讀 7574

前言redis是基於鍵值對的nosql資料庫,redis的value可以由string,hash,list,set,zset,bitmaps,hyperloglog等多種資料結構和演算法組成。redis還提供了鍵過期,發布訂閱,事務,lua指令碼,哨兵,cluster等功能。redis執行命令非常快,根據官方給的效能可以達到10w+qps。

開發語言

redis是由c實現的,所以執行會比較快。

純記憶體操作

redis將所有資料放在記憶體中,不需要從磁碟來回讀取資料,沒有了i/o,記憶體響應時間大約為100納秒。

上圖:

主頻3.1g,意思是每秒可以執行3.1*10^9個指令。記憶體比它慢百倍,磁碟比它慢百萬倍。

借了一張《深入理解計算機系統》的圖,展示了乙個典型的儲存器層次結構,在l0 層,cpu可以在乙個時鐘週期訪問到,基於sram的快取記憶體儲存器,可以在幾個cpu時鐘週期訪問到,然後是基於dram的主存,可以在幾十到幾百個時鐘週期訪問到他們。

3. 單執行緒

第一、單執行緒簡化演算法實現,併發的資料結構實現不但困難,測試也麻煩。

第二、單執行緒避免了執行緒切換以及枷鎖釋放鎖帶來的消耗。

因此,也會有缺點:**阻塞**。如果乙個命令過長,那麼會造成其他命令的阻塞

除此之外,nginx,node.js也是單執行緒。但是效能都很高。

4. 非阻塞多路i/o復用機制

在這之前先要說一下傳統的阻塞i/o是如何工作的:當使用read或者write對某一檔案描

述符(file descriptor fd)進行讀寫的時候,如果資料沒有收到,那麼該執行緒會被掛

起,直到收到資料。阻塞模型雖然易於理解,但是在需要處理多個客戶端任務的候不

會使用阻塞模型。

i/o多路復用實際上是指多個連線的**管理可以在同一程序。多路是指網路連線,復用只是同乙個執行緒。在網路服務中,i/o多路復用起的作用是一次性把多個連線的事件通知業務**處理,處理的方式由業務**來決定。在i/o多路復用模型中,最重要的函式呼叫就是i/o 多路復用函式,該方法能同時監控多個檔案描述符(fd)的讀寫情況,當其中的某些fd可讀/寫時,該方法就會返回可讀/寫的fd個數。

舉個形象的例子吧。比如乙個tcp伺服器處理20個客戶端socket。

a方案:順序處理,如果第乙個socket因為網絡卡讀資料處理慢了,一阻塞後面都玩完。

b方案:每個socket請求都建立乙個分身子程序來處理,不說每個程序消耗大量系統資源,光是程序切換就夠作業系統累的了。

c方案(i/o復用模型,epoll):將使用者socket對應的fd註冊進epoll(實際上伺服器和作業系統之間傳遞的不是socket的fd而是fd_set的資料結構),然後epoll只告訴哪些需要讀/寫的socket,只需要處理那些活躍的、有變化的socket fd的就好了。

這樣,整個過程只在呼叫epoll的時候才會阻塞,收發客戶訊息是不會阻塞的。

redis為什麼那麼快

目錄 redis快的原因 為什麼不採用多程序或多執行緒處理?單執行緒處理的缺點?多路 i o 復用 redis完全基於記憶體,絕大部分請求是存粹的記憶體操作,執行效率高,每秒能夠達到10萬 s的查詢速度 資料結構簡單,對資料操作也簡單 採用多路i o復用,非阻塞io,採用多路 i o 復用技術可以讓...

Redis效能解析 Redis為什麼那麼快?

redis的實際被應用都是因為它的效能,在眾多快取中redis也是乙個比較快的中介軟體,而且它是單執行緒操作,沒有過的記憶體開銷,給程式帶來了更多的擴充套件空間。在保證網路通暢的情況下,相同的cpu和相同的redis版本,處理不同大小的資料,redis的吞吐量如下圖所示,該圖來自redis的官方 我...

redis之效能介紹 為什麼那麼快

1.redis benchmark是我們在安裝redis的時候,自帶的乙個命令工具localhost gaoxinfu ls la usr local bin grep redis rwxr xr x 1 gaoxinfu admin 113008317 21 01 redis benchmark ...