單線程Redis快的4 個原因總結(jié)
內(nèi)存數(shù)據(jù)存儲
訪問 RAM 比磁盤快幾個數(shù)量級
Redis 是一個基于內(nèi)存存儲數(shù)據(jù),也就是上面表的RAM。
Redis 中的每個讀寫操作都等同于從命中 RAM(隨機(jī)存取存儲器)的變量中讀取和寫入。
訪問 RAM 比直接訪問磁盤快幾個數(shù)量級,因此,Redis 比其他數(shù)據(jù)存儲快得多。
優(yōu)良的數(shù)據(jù)結(jié)構(gòu)
作為內(nèi)存中的數(shù)據(jù)存儲,Redis 利用各種底層數(shù)據(jù)結(jié)構(gòu)來高效地存儲數(shù)據(jù),而無需擔(dān)心如何將它們持久化到持久存儲中。
例如,Redis 列表是使用鏈表實(shí)現(xiàn)的,該鏈表允許在列表的頭部和尾部附近進(jìn)行恒定時間 O(1) 的插入和刪除。
另一方面,Redis 排序集是通過跳躍列表實(shí)現(xiàn)的,它可以實(shí)現(xiàn)更快的查詢和插入。
簡而言之,無需擔(dān)心持久化數(shù)據(jù),Redis 中的數(shù)據(jù)可以更有效地存儲,以便通過不同的數(shù)據(jù)結(jié)構(gòu)進(jìn)行快速檢索。
單線程架構(gòu)
單線程進(jìn)程
Redis 的寫入和讀取速度極快,CPU 使用率對 Redis 來說從來都不是問題。
根據(jù) Redis 官方文檔,在普通 Linux 系統(tǒng)上運(yùn)行時,Redis 每秒可以傳遞多達(dá) 100 萬個請求。
然而,瓶頸主要來自網(wǎng)絡(luò) I/O。Redis 中的處理時間主要浪費(fèi)在等待網(wǎng)絡(luò) I/O 上。
雖然多線程架構(gòu)允許應(yīng)用程序通過上下文切換并發(fā)處理任務(wù),但 Redis 的性能提升是微乎其微的,因?yàn)榇蠖鄶?shù)線程最終會在 I/O 中被阻塞。
通過采用單線程架構(gòu),Redis有下面的幾個好處:
- 最小化由于線程創(chuàng)建或銷毀引起的 CPU 消耗
- 最大限度地減少由于上下文切換引起的 CPU 消耗
- 減少鎖開銷,因?yàn)槎嗑€程應(yīng)用程序需要鎖來進(jìn)行線程同步,這很容易出錯
- 能夠使用各種“線程不安全”命令,例如 lpush
非阻塞 I/O
為了處理傳入的請求,服務(wù)器需要在套接字上調(diào)用系統(tǒng)調(diào)用以將數(shù)據(jù)從網(wǎng)絡(luò)緩沖區(qū)讀取到用戶空間。
這通常是一個阻塞操作,線程被阻塞并且在完全接收到來自客戶端的數(shù)據(jù)之前什么都不做。
為什么我們不在確定套接字中的數(shù)據(jù)已準(zhǔn)備好讀取時才調(diào)用系統(tǒng)調(diào)用?
這就是 I/O 多路復(fù)用發(fā)揮作用的地方。
I/O 多路復(fù)用模塊同時監(jiān)視多個套接字,并且只返回可讀的套接字。
準(zhǔn)備好讀取的套接字被推送到單線程事件循環(huán),并由相應(yīng)的處理程序使用Reactor Pattern
進(jìn)行處理。
簡而言之,
- 由于其阻塞性質(zhì),網(wǎng)絡(luò) I/O 很慢
- Redis內(nèi)存操作速度快,Redis收到命令后可以快速執(zhí)行
因此,Redis 有意識地做出以下決定:
- 使用 I/O 多路復(fù)用來緩解緩慢的網(wǎng)絡(luò) I/O 問題
- 使用單線程架構(gòu)減少鎖開銷
總結(jié)
綜上所述,單線程架構(gòu)是Redis團(tuán)隊經(jīng)過時間考驗(yàn)的深思熟慮的選擇。盡管是單線程的,Redis 仍然是性能最高和最常用的內(nèi)存數(shù)據(jù)存儲之一。
到此這篇關(guān)于單線程Redis快的4 個原因總結(jié)的文章就介紹到這了,更多相關(guān)單線程Redis快內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis基礎(chǔ)學(xué)習(xí)之管道機(jī)制詳析
這篇文章主要給大家介紹了關(guān)于Redis基礎(chǔ)學(xué)習(xí)之管道機(jī)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11Redis之如何實(shí)現(xiàn)用戶關(guān)注
這篇文章主要介紹了Redis之如何實(shí)現(xiàn)用戶關(guān)注問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03