
1. Redis簡介
Redis是一個開源的,基于記憶體的,高性能的鍵值型資料庫,它支持多種資料結構,包含五種基本型別 String(字串)、Hash(哈希)、List(串列)、Set(集合)、Zset(有序集合),和三種特殊型別 Geo(地理位置)、HyperLogLog(基數統計)、Bitmaps(位圖),可以滿足各種應用場景的需求,
Redis還提供了多種特性,如持久化、事務、發布訂閱、Lua腳本、管道、主從復制、哨兵機制、集群機制等,可以保證資料的安全性、一致性和可用性,
Redis的速度非常快,官方稱其可以達到每秒10萬次的讀寫操作,和其他資料庫相比,Redis有著明顯的優勢,例如,和MySQL相比,Redis的速度大約快了100倍;和MongoDB相比,Redis的速度大約快了10倍,這些優勢使得Redis成為了很多互聯網公司和開發者的首選資料庫,
那么,Redis為什么這么快呢?主要有以下幾個原因:
- 使用記憶體存盤資料,避免了磁盤IO的開銷,提高了資料訪問的速度,
- 豐富的物件型別,包含8種物件型別,滿足不同場景的需求,
- 高效的資料結構,減少了記憶體占用和計算復雜度,提高了資料操作的效率,
- 單執行緒模型,避免了多執行緒之間的背景關系切換和競爭條件,提升CPU利用率,
- 非阻塞IO多路復用機制,充分利用CPU和網路資源,提高了并發處理能力,
本文將詳細介紹Redis為什么這么快的原理和機制,并給出一些實際應用和優化建議,
2. 記憶體操作
Redis是一種基于記憶體的資料庫,與傳統的基于磁盤的資料庫(例如MySQL)不同,它將所有的資料都存盤在記憶體中,
那么,Redis為什么選擇記憶體存盤資料呢?主要有以下幾個原因:
- 記憶體的速度遠遠快于磁盤,記憶體讀寫速度可以達到每秒數百GB,而磁盤讀寫速度通常只有數十MB,萬倍的差距,
- 記憶體可以支持更多的資料結構和操作,常見的資料結構如陣列、鏈表、樹、哈希、集合等,常見的操作如排序、查找、過濾、聚合等,記憶體是一個靈活介質,滿足各種復雜和高效的功能,不是磁盤操作可比的,
- 記憶體可以支持更高的并發和擴展性,記憶體是一種分布式和并行的存盤介質,它可以支持多個CPU核心同時訪問同一塊記憶體區域,也可以支持多個服務器之間共享同一塊記憶體區域,磁盤是一種集中式和串行的存盤介質,它只能支持一個CPU核心或一個服務器訪問同一塊磁盤區域,也不能支持多個服務器之間共享同一塊磁盤區域,
當然,Redis使用記憶體存盤資料也有一些缺點和限制:
- 記憶體限制:記憶體是非常昂貴的,容量通常只有幾十GB或幾百GB,而磁盤目前都是TB起步,所以我們通常只會把少量的、經常訪問的資料存盤在記憶體中,
- 資料型別限制:Redis不支持復雜的資料結構,比如用戶物件,通常只能序列化成字串后再存盤,查詢的時候再把字串反序列化成用戶物件,
- 資料備份問題:在服務器重啟或崩潰時,存盤的記憶體中的資料可能會丟失,通常采用持久化技術將資料保存到磁盤上,同時定期備份資料以防止資料丟失,
3. 豐富的物件型別
Redis包含五種基本型別 String(字串)、Hash(哈希)、List(串列)、Set(集合)、Zset(有序集合),和三種特殊型別 Geo(地理位置)、HyperLogLog(基數統計)、Bitmaps(位圖),可以滿足各種應用場景的需求,
- String可以用來做快取、計數器、限流、分布式鎖、分布式Session等,
- Hash可以用來存盤復雜物件,
- List可以用來做訊息佇列、排行榜、計數器、最近訪問記錄等,
- Set可以用來做標簽系統、好友關系、共同好友、排名系統、訂閱關系等,
- Zset可以用來做排行榜、最近訪問記錄、計數器、好友關系等,
- Geo可以用來做位置服務、物流配送、電商推薦、游戲地圖等,
- HyperLogLog可以用來做用戶去重、網站UV統計、廣告點擊統計、分布式計算等,
- Bitmaps可以用來做在線用戶數統計、黑白名單統計、布隆過濾器等,
4. 高效的資料結構
Redis有6種資料結構sds(簡單動態字串)、ziplist(壓縮串列)、linkedlist(鏈表)、intset(整數集合)、hashtable(字典)、skiplist(跳躍表),
Redis的8種物件型別底層都是基于這5種資料結構實作的,豐富的資料結構可以減少記憶體占用和計算復雜度,提高資料操作的效率,

5. 單執行緒模型
Redis使用單執行緒模型,這意味著它只使用一個CPU來處理所有請求,因此,Redis不需要考慮多執行緒之間的同步、鎖、競爭等問題,也不需要花費時間和資源在多執行緒之間的背景關系切換上,這使得Redis的設計和實作更簡單,性能和效率更高,
那么,Redis為什么選擇單執行緒模型呢?主要有以下幾個原因:
- Redis性能瓶頸不在于CPU,而在于記憶體和網路,因為Redis使用記憶體存盤資料,所以資料訪問非常迅速,不會成為性能瓶頸,此外,Redis的資料操作大多數都是簡單的鍵值對操作,不包含復雜計算和邏輯,因而CPU開銷很小,相反,Redis的瓶頸在于記憶體的容量和網路的帶寬,這些問題無法通過增加CPU核心來解決,
- Redis的單執行緒模型可以保證資料的一致性和原子性,由于Redis只有一個執行緒來處理所有的請求,所以不會出現多個執行緒同時修改同一個資料的情況,也不需要使用鎖或事務來保證資料的一致性和原子性,
- Redis的單執行緒模型可以避免多執行緒編程的復雜性和難度,例如執行緒安全、死鎖、記憶體泄漏、競態條件等,降低了開發和維護的成本和風險,
6. 多路IO復用模型
Redis使用單執行緒模型來處理客戶端的請求,但是它能夠利用多路I/O復用技術來實作高并發和高吞吐量,
那么,什么是多路I/O復用模型?
多路I/O復用模型是指使用一個執行緒來監控多個檔案描述符(fd)的讀寫狀態,當某個fd準備好執行讀或寫操作時,就通知相應的事件處理器來處理,這樣就避免了阻塞式I/O模型中,單個執行緒只能等待一個fd的問題,提高了I/O效率和利用率,
例如Linux系統中提供了多種多路I/O復用技術的實作方式,如select、poll、epoll等,
7. 總結
本文介紹了Redis為什么如此快的原因,
首先,Redis使用記憶體存盤資料,避免了磁盤I/O的開銷,提高了資料訪問的速度,其次,Redis擁有豐富的物件型別,包含八種型別,滿足不同的需求,此外,Redis采用了高效的資料結構,減少了記憶體占用和計算復雜度,Redis還使用單執行緒模型,避免了多執行緒之間的背景關系切換和競爭條件,提升了CPU利用率,最后,Redis使用非阻塞I/O多路復用機制,充分利用CPU和網路資源,提高了并發處理能力,
我是「一燈架構」,如果本文對你有幫助,歡迎各位小伙伴點贊、評論和關注,感謝各位老鐵,我們下期見

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/550057.html
標籤:NoSQL
下一篇:redis 工具類
