Redis為什麼能抗住10萬併發?揭秘性能優越的背後原因

来源:https://www.cnblogs.com/yidengjiagou/archive/2023/04/13/17312772.html
-Advertisement-
Play Games

Redis是一個開源的,基於記憶體的,高性能的鍵值型資料庫。它支持多種數據結構,包含五種基本類型 String(字元串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合),和三種特殊類型 Geo(地理位置)、HyperLogLog(基數統計)、Bitmaps(點陣圖),可以滿足各... ...


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為什麼選擇記憶體存儲數據呢?主要有以下幾個原因:

  1. 記憶體的速度遠遠快於磁碟。記憶體讀寫速度可以達到每秒數百GB,而磁碟讀寫速度通常只有數十MB,萬倍的差距。
  2. 記憶體可以支持更多的數據結構和操作。常見的數據結構如數組、鏈表、樹、哈希、集合等,常見的操作如排序、查找、過濾、聚合等。記憶體是一個靈活介質,滿足各種複雜和高效的功能,不是磁碟操作可比的。
  3. 記憶體可以支持更高的併發和擴展性。記憶體是一種分散式和並行的存儲介質,它可以支持多個CPU核心同時訪問同一塊記憶體區域,也可以支持多個伺服器之間共用同一塊記憶體區域。磁碟是一種集中式和串列的存儲介質,它只能支持一個CPU核心或一個伺服器訪問同一塊磁碟區域,也不能支持多個伺服器之間共用同一塊磁碟區域。

當然,Redis使用記憶體存儲數據也有一些缺點和限制:

  1. 記憶體限制:記憶體是非常昂貴的,容量通常只有幾十GB或幾百GB,而磁碟目前都是TB起步。所以我們通常只會把少量的、經常訪問的數據存儲在記憶體中。
  2. 數據類型限制:Redis不支持複雜的數據結構,比如用戶對象,通常只能序列化成字元串後再存儲,查詢的時候再把字元串反序列化成用戶對象。
  3. 數據備份問題:在伺服器重啟或崩潰時,存儲的記憶體中的數據可能會丟失。通常採用持久化技術將數據保存到磁碟上,同時定期備份數據以防止數據丟失。

3. 豐富的對象類型

Redis包含五種基本類型 String(字元串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合),和三種特殊類型 Geo(地理位置)、HyperLogLog(基數統計)、Bitmaps(點陣圖),可以滿足各種應用場景的需求。

  1. String可以用來做緩存、計數器、限流、分散式鎖、分散式Session等。
  2. Hash可以用來存儲複雜對象。
  3. List可以用來做消息隊列、排行榜、計數器、最近訪問記錄等。
  4. Set可以用來做標簽系統、好友關係、共同好友、排名系統、訂閱關係等。
  5. Zset可以用來做排行榜、最近訪問記錄、計數器、好友關係等。
  6. Geo可以用來做位置服務、物流配送、電商推薦、游戲地圖等。
  7. HyperLogLog可以用來做用戶去重、網站UV統計、廣告點擊統計、分散式計算等。
  8. Bitmaps可以用來做線上用戶數統計、黑白名單統計、布隆過濾器等。

4. 高效的數據結構

Redis有6種數據結構sds(簡單動態字元串)、ziplist(壓縮列表)、linkedlist(鏈表)、intset(整數集合)、hashtable(字典)、skiplist(跳躍表)。

Redis的8種對象類型底層都是基於這5種數據結構實現的,豐富的數據結構可以減少記憶體占用和計算複雜度,提高數據操作的效率。

5. 單線程模型

Redis使用單線程模型,這意味著它只使用一個CPU來處理所有請求。因此,Redis不需要考慮多線程之間的同步、鎖、競爭等問題,也不需要花費時間和資源在多線程之間的上下文切換上。這使得Redis的設計和實現更簡單,性能和效率更高。

那麼,Redis為什麼選擇單線程模型呢?主要有以下幾個原因:

  1. Redis性能瓶頸不在於CPU,而在於記憶體和網路。因為Redis使用記憶體存儲數據,所以數據訪問非常迅速,不會成為性能瓶頸。此外,Redis的數據操作大多數都是簡單的鍵值對操作,不包含複雜計算和邏輯,因而CPU開銷很小。相反,Redis的瓶頸在於記憶體的容量和網路的帶寬,這些問題無法通過增加CPU核心來解決。
  2. Redis的單線程模型可以保證數據的一致性和原子性。由於Redis只有一個線程來處理所有的請求,所以不會出現多個線程同時修改同一個數據的情況,也不需要使用鎖或事務來保證數據的一致性和原子性。
  3. 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和網路資源,提高了併發處理能力。

我是「一燈架構」,如果本文對你有幫助,歡迎各位小伙伴點贊、評論和關註,感謝各位老鐵,我們下期見

image


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • terminal,vi 的使用: 0.進入與使用 用終端進入,相當於windows的cmd. ctrl+alt+T打開終端。 終端命令:ls查看文件夾下的文件 mkdir filename在當前目錄下創造一個文件夾 cd filename 進入某文件夾 . 代表當前目錄 .. 上層目錄 ping i ...
  • 1. 1969年 1.1. 關係模型的創始人E.F. Codd(1923—2003) 1.1.1. 牛津大學數學專業 1.1.2. 一己之力奠定了關係模型的基礎 1.2. 論文《大型資料庫中關係存儲的可推導性、冗餘與一致性》 2. 1970年 2.1. 權威學術雜誌Communications of ...
  • 鎖屏面試題百日百刷,每個工作日堅持更新面試題。請看到最後就能獲取你想要的,接下來的是今日的面試題: 1.如何保證Kafka的消息有序 Kafka對於消息的重覆、丟失、錯誤以及順序沒有嚴格的要求。 Kafka只能保證一個partition中的消息被某個consumer消費時是順序的,事實上,從Topi ...
  • Oracle資料庫還原恢復後,執行alter database open resetlogs時遇到下麵錯誤。如下所示: SQL> alter database open resetlogs;alter database open resetlogs*ERROR at line 1:ORA-00603 ...
  • redis 工具類 /** * Redis 工具類 */ @Component public class RedisUtil { @Resource private RedisTemplate<String, Object> redisTemplate; public RedisUtil(Redis ...
  • 摘要:query_band是一個會話級別(session)的GUC參數,本身是字元串類型,支持任意形式字元組合。 本文分享自華為雲社區《GaussDB(DWS)的query_band負載識別與應用》,作者:門前一棵葡萄樹。 query_band概述 GaussDB(DWS)實現了基於query_ba ...
  • 摘要:多跳查詢能力也是一個衡量產品性能非常重要的指標。 本文分享自華為雲社區《聊聊超級快的圖上多跳過濾查詢》,作者:弓乙。 在圖資料庫/圖計算領域,多跳查詢是一個非常常用的查詢,通常來說以下類型的查詢都可以算作是多跳過濾查詢: 1.查詢某個用戶的朋友認識的朋友 --二跳指定點label的查詢 2.查 ...
  • 微信小程式雲開發(WeChat Mini Program Cloud Development)是微信官方推出的一種簡化小程式開發的方案。它提供了一個完整的後端雲服務,支持資料庫、存儲、雲函數等功能。在雲開發中,Command 是一個重要的概念,主要用於操作資料庫。 Command 是資料庫命令的構造 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...