Redis 7.0 源碼環境搭建與閱讀技巧

来源:https://www.cnblogs.com/uniqueDong/archive/2023/10/26/17790463.html
-Advertisement-
Play Games

天下武功,無堅不摧,唯快不破!我的名字叫 Redis,全稱是 Remote Dictionary Server。 有人說,組 CP,除了要瞭解她外,還要給機會讓她瞭解你。 那麼,作為開發工程師的你,是否願意認真閱讀此心法抓住機會來瞭解我,運用到你的系統中提升性能。 我遵守 BSD 協議,由義大利人 ...


天下武功,無堅不摧,唯快不破!我的名字叫 Redis,全稱是 Remote Dictionary Server。

有人說,組 CP,除了要瞭解她外,還要給機會讓她瞭解你。

那麼,作為開發工程師的你,是否願意認真閱讀此心法抓住機會來瞭解我,運用到你的系統中提升性能。

我遵守 BSD 協議,由義大利人 Salvatore Sanfilippo 使用 C 語言編寫的一個基於記憶體實現的鍵值型非關係(NoSQL)資料庫。

我是一個記憶體數據結構存儲、可作為資料庫、緩存、消息隊列、流處理引擎,速度快是我的特點。

根據官方數據,Redis 的 QPS 可以達到約 100000(每秒請求數)。

我提供了 String(字元串)、Hashes(散列表)、Lists(列表)、Sets(無序集合)、Sorted Sets(可根據範圍查詢的排序集合)、Bitmap(點陣圖)、HyperLogLog、Geospatial (地理空間)和 Stream(流)等數據結構。

數據結構的使用技法和實現原理是你核心築基必經之路,好好修煉。

除此之外,我還具有主從複製、Lua 腳本、LRU 淘汰機制,事務和不同級別的磁碟持久化功能,並通過 Redis Sentinel(哨兵)和 Redis Cluster(Redis 集群)實現高可用,這部分內容,重中之重,高手必備。

我還支持一些原子操作,支持非同步複製實現快速非阻塞同步和自動重連,另外需要註意的是,推薦你在 Lunix /Unix 系統上部署,官方並沒有在 Windows 系統上構建安裝包。

1.1.1 Redis 能幹啥

程許媛:“Redis 你說了這麼多?你能幹啥?別王婆賣瓜,自賣自誇。”

緩存

這是我被使用的最多的場景,能極大提升應用程式的性能。當單個 MySQL 讀寫壓力比較大,場景是讀多寫少的時候,把熱點數據存儲在更快的存儲中,也就是 Redis。

讀取數據

  1. 先從緩存中讀取數據是否命中。
  2. 緩存未命中,則查詢資料庫獲取數據,並把數據寫到 Redis 中,讓後續讀取相同數據的請求命中緩存,最後把數據返回給調用者。
  3. 緩存命中,直接返回。

寫數據

至於修改數據,程式員想了很多方法去儘可能保證 Redis 與 MySQL 的數據一致性。

  • 先寫 MySQL 數據,再刪除 Redis 緩存數據。
  • 監聽 MySQL binlog 日誌,修改 Redis 數據。

排行榜

使用 MySQL 等關係型資料庫,非常麻煩,性能也差,而直接使用 Redis SortedSet 輕鬆搞定。

消息隊列

簡單消息隊列,在一些不需要高可靠,但是數據量大會給 MySQL 帶來非常大壓力的場景,比如:到貨通知、未讀消息、郵件發送之列的。程式員可以使用 Lists 或者 Stream 來實現一個隊列。

分散式鎖

Redisson 這個框架,就是使用 Redis 弄出了一套分散式鎖解決方案。

計數器

Redis 的命令都是原子性的,程式員可以輕鬆地利用 INCRDECR命令來構建計數器系統。

還有很多場景,我會在後面章節詳細道來,學完之後,我相信你定能築基鍛體,念頭通達,升職加薪。

千古無同局,葉底能否藏花,我們未來印證,願此心法能讓你學有所成,你來,我等著。

1.1.2 源代碼編譯

經過上一篇的 Redis 簡介,我相信你一定想繼續瞭解 Redis。本章節會通過源代碼編譯來安裝 Redis 7.0.5,讓你在自己的機器上搭建一套可以 Debug 的 Redis 7.0.5 源碼環境。

這也是後續原理分析的基礎,推薦你部署在 macOS 或者 Linux 上搭建,如果你是 Windows 環境,那就搞一個虛擬機在上面裝一個 Linux 系統,再繼續搭建 Redis 環境。

程許媛:“我的電腦是 mac OS 系統,你就用這個來演示吧。”

獲取源代碼

有兩種方式,第一種是從官網下載 Redis 源碼壓縮包,如圖 1-1 所示。

圖1-1

圖 1-1

將壓縮包解壓得到一個文件夾。

第二種方式,通過 git clone 獲取源碼。

從 Github 上,使用 git clone https://github.com/redis/redis.git指令下載,下載完成後你會得到如下文件。

圖 1-2

圖 1-2

進入 redis 目錄,使用 git checkout 切換到 7.0.5 這個 tag 。

gir checkout tags/7.0.5 -b 7.0.5

編譯 Redis

在編譯之前,需要安裝一些環境依賴,Redis 是 C 語言編寫的,所以還需要 gcc 編譯器。

執行 gcc -v判斷是否安裝了編譯器。

圖 1-3

圖 1-3

沒有安裝的話,使用如下指令安裝。

xcode-select --install

一切準備就緒,進入 redis 的源碼目錄,執行 make命令,這個就好比 Java 中的 mvn 命令。

make CFLAGS="-g -O0" MALLOC=jemalloc

命令後邊的 “-O0” 參數表示告訴編譯器不要優化代碼,防止你在 Debug 的時候, IDE 裡面的 Redis 源碼與實際運行的代碼對應不上。

MALLOC=jemalloc ,指定在 mac OS 系統上 Redis 使用 jemalloc 記憶體分配器來分配記憶體,Linux 預設使用該分配器。

需要註意的是記憶體碎片自動清理功能只在 jemalloc 記憶體分配器生效。

如果安裝包用於生產環境的 Linux 系統上,那麼直接使用指令 make命令即可。

編譯成功,將會看到圖 1-4 中Hint: It's a good idea to run 'make test' ;),提示我們可以運行單元測試,這一步可以省略。

圖 1-4

圖 1-4

啟動 Redis

編譯成功,進入 src 源碼目錄下,你會看到一個 redis-server 的可執行程式,使用如下指令啟動。

./redis-server ../redis.conf

圖 1-5

圖 1-5

代碼調試環境搭建

編譯好了,我們還差一個方便閱讀和調試源碼的工具。為了方便閱讀和 debug 源碼,極力推薦你使用 CLion 來閱讀和調試 Redis 源碼,我使用的是 CLion 2021.3 版本。

安裝好以後,打開 CLion,點擊 open,選擇 Redis 源碼目錄即可。

圖 1-6

圖 1-6

之後檢查下 Run Debug 是否出現這些選項,選擇編輯。

圖 1-7

圖 1-7

選擇編輯 redis-server ,指定啟動配置文件 redis.conf的目錄,保存。

圖 1-8

圖 1-8

server.cmain() 方法加斷點,Debug 啟動 redis -server,進行源碼 Debug。

圖 1-9

圖 1-9

大功告成,接下來就可以在 Redis 的知識海洋里嗆水了。

目錄結構

在知識海洋嗆水之前,先來瞭解下 Redis 的目錄結構,從 Redis 整體目錄結構來對系統有個全局的認識,瞭解一個系統的主要組成,同時防止陷入細節或者無從下手。

deps

這個目錄主要包含 Redis 所依賴的第三方代碼庫。

  • Jemalloc,記憶體分配器,預設情況下選擇該記憶體分配器來代替 Linux 系統的 libc-malloc,libc-malloc 性能不高,且碎片化嚴重
  • hiredis,這是官方 C 語言客戶端。
  • linenoise 是一種讀線替換。它由 Redis 的同一作者開發,但作為一個單獨的項目進行管理,並根據需要進行更新。
  • lua,顧名思義,就是 lua 相關的功能。
  • hdr_histogram,用於生成每個命令的延遲跟蹤直方圖。

src 目錄

這是 Redis 源碼的重要組成部分,裡面有 commandsmodules 兩個子目錄,其餘功能模塊的源碼都在 src 目錄下,這是最重要的目錄。

modules目錄包含了實現Redis module的示例代碼,commands裡面都是 json 格式的文件,包含了每個指令的元信息。

tests 目錄

顧名思義,功能模塊測試和單元測試的代碼就在這裡。

  • cluster,Redis Cluster 功能測試。
  • sentinel,哨兵集群功能測試。
  • unit,單元測試。
  • integration,主從複製功能測試。

剩下的 assets、helpers、modules、support 四個目錄中是用來支撐測試功能的。

utils 目錄

輔助性功能的腳本或者代碼,比如用於創建 Redis Cluster 的腳本,lru 演算法效果展示代碼等。

除此之外,Redis 源碼目錄還有兩個重要的文件,redis.conf 和 sentinel.conf,分別用於配置 Redis 實例運行和哨兵配置。

加我微信進去專屬技術群,歡迎讀者提出意見,喜歡請關註博客和個人公眾號:碼哥位元組
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文詳盡地探討了Go語言的內建命令集,包括但不限於go build、go run、go get等。文章首先列舉了所有常用的Go命令,並用表格形式簡潔地解釋了它們的功能。隨後,我們逐一深入講解了每個命令的使用說明、應用場景,以及實際操作中可能遇到的輸出結果。 關註【TechLeadCloud】,分享互 ...
  • 最近有用戶反饋測試環境Java服務總在凌晨00:00左右掛掉,用戶反饋Java服務沒有定時任務,也沒有流量突增的情況,Jvm配置也合理,莫名其妙就掛了 ...
  • 在Java編程中,我們經常需要找出兩個列表(List)中的重覆元素。在本文中,我們將探討三種方法來實現這一目標。 ...
  • 來源:https://www.cnblogs.com/liuboren/p/17017421.html 0.前言 本篇文章是<<代碼整潔之道>>的學習總結, 通過這篇文章你將瞭解到整潔的代碼對項目、公司和你的重要性,以及如何書寫整潔的代碼. 通過命名、類、函數、測試這四個章節,使我們的代碼變得整潔. ...
  • MDI窗體的相關學習使用 1、設置MDI父窗體 在屬性中找到IsMdiContainer選項,設置為True 2、添加MDI子窗體,在項目中依次選擇添加->窗體,然後一直預設即可 添加後的項目目錄(Form1為父視窗,Form2、Form3為子視窗) 3、在Form1.cs中,創建對應MDI子視窗的 ...
  • 【學習課程】:【【小白入門 通俗易懂】2021韓順平 一周學會Linux】 https://www.bilibili.com/video/BV1Sv411r7vd/?p=14&share_source=copy_web&vd_source=2c07d62293f5003c919b2df9b2e054 ...
  • 電腦數據的表示 1. 數值數據的表示 1.1 各種進位數的表示 二進位 (Binary) :以 0b 或 0B 開頭,字元僅含0和1. 用下標2或者數字後面加B表示。如 $(1011)_2$ 或 $1011B$ 八進位 (Octal) :以 0o 或 0O 開頭,字元含0-7. 用下標8或者數字後 ...
  • 1. 圖論 1.1. 起源於萊昂哈德·歐拉在1736年發表的一篇關於“哥尼斯堡七橋問題”的論文 1.2. 要解決這個問題,該圖需要零個或兩個具有奇數連接的節點 1.3. 任何滿足這一條件的圖都被稱為歐拉圖 1.4. 如果路徑只訪問每條邊一次,則該圖具有歐拉路徑 1.5. 如果路徑起點和終點相同,則該 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...