redis 源碼閱讀

官網下載zip:
在這里插入圖片描述
本文即是文件創建時間時候的版本~

文章目錄

    • 目錄結構
      • /src
        • int main()
        • 服務端 server
          • 足夠的熵值 entropy
          • umask掩碼
          • 系統初始化*
          • 重啟機制:保存執行數據 以便后續重啟服務
          • 哨兵模式 sentinel
          • rdb aof
          • 解析命令行參數
          • 聲明實現的位置

目錄結構

目錄/文件說明
src/?核心源代碼目錄,大多數邏輯都在這里
deps/依賴的第三方庫,如 jemalloc、hiredis
tests/單元測試和集成測試代碼
redis.conf默認的 Redis 配置文件
Makefile編譯入口,可通過 make 編譯 redis-server 等
README.md項目簡介
utils/一些工具腳本,比如 create-cluster

/src

int main()

在這里插入圖片描述

程序執行命令功能
redis-server./src/redis-server啟動 Redis 【服務端】
redis-cli./src/redis-cli連接 Redis 的【命令行客戶端】
redis-benchmark./src/redis-benchmark對 Redis 做壓力測試
setproctitle開發/調試輔助工具設置 Linux 進程名用的工具模塊
服務端 server

從上往下讀讀注釋:

足夠的熵值 entropy

在這里插入圖片描述
為了確保獲取到的隨機數具有足夠的熵值(entropy),我們不能僅依賴 time() 和 getpid()。

因為在 容器(如 Docker) 中運行多個 Redis 實例時:

  • 它們的 time()(當前時間戳 - 秒級)
  • 和 getpid()(進程號)

可能是一樣的!
導致它們生成的隨機數是一樣的。

微秒tv_usec 幾乎不可能重復 —— 一秒中可以有 100 萬 個不同的微秒值(0~999999)

	struct timeval tv;.../* To achieve entropy, in case of containers, their time() and getpid() can* be the same. But value of tv_usec is fast enough to make the difference */gettimeofday(&tv,NULL); //獲取微秒級時間戳srand(time(NULL)^getpid()^tv.tv_usec); //種隨機數種子srandom(time(NULL)^getpid()^tv.tv_usec);init_genrand64(((long long) tv.tv_sec * 1000000 + tv.tv_usec) ^ getpid()); //【初始化 Redis 自己實現的 Mersenne Twister 64 位隨機數發生器】【梅森旋轉算法】crc64_init(); //初始化 【CRC64 校驗表】;Redis 中使用 CRC64 進行數據校驗
umask掩碼

在這里插入圖片描述

存儲 umask 值。因為 umask(2) 只提供設置并返回舊值的接口,
所以我們必須先設置一次再恢復它。
我們在啟動早期執行這一步,是為了避免與可能正在創建文件或目錄的線程之間產生競態條件(race condition)。

umask 是 Unix 系統下用于設置默認新建文件權限的掩碼(默認文件0666/目錄0777,當 umask = 0022時(2 = 010),文件0644/目錄0755)
(0777二進制: 0 111 111 111)

沒有純獲取 umask 的接口,而 set 時可以返回之前的值
所以可以通過 umask(umask(0)) 的方式獲取~

系統初始化*

在這里插入圖片描述
ASAP:as soon as possible 盡快
sentinel mode: 哨兵模式 后面才初始化

strrchr() C標準庫函數【string reverse chracter】:從右向左查找字符串中最后一次出現 ‘/’ 的位置,返回該位置的指針。
這里只想要執行的文件名

	uint8_t hashseed[16];getRandomBytes(hashseed,sizeof(hashseed));//Redis 自己的隨機字節生成函數dictSetHashFunctionSeed(hashseed);// 初始化全局字典等結構中的哈希行為char *exec_name = strrchr(argv[0], '/');if (exec_name == NULL) exec_name = argv[0];server.sentinel_mode = checkForSentinelMode(argc,argv, exec_name);// 判斷是否是 sentinel 模式,這是 Redis 支持的一種高可用模式。initServerConfig();// 初始化服務配置(比如監聽端口、最大連接數、緩存設置等)//初始化 ACL(訪問控制列表)子系統 【Redis 的權限控制系統】ACLInit(); /* The ACL subsystem must be initialized ASAP because thebasic networking code and client creation depends on it. */ // 后面的網絡服務和客戶端創建依賴它moduleInitModulesSystem();// 初始化模塊管理框架 // Redis 支持以插件形式加載模塊,比如 RedisGraph、RedisAI 等connTypeInitialize();// 初始化連接類型  // 用于注冊不同類型的連接(TCP、Unix socket、TLS 等)
重啟機制:保存執行數據 以便后續重啟服務

在這里插入圖片描述
“將可執行文件路徑和參數安全地保存下來,以便之后能夠重新啟動服務器。”

    /* Store the executable path and arguments in a safe place in order* to be able to restart the server later. */server.executable = getAbsolutePath(argv[0]); // 獲取當前進程的可執行文件的絕對路徑:argv[0] 通常是執行程序的名稱或者路徑server.exec_argv = zmalloc(sizeof(char*)*(argc+1)); // 為參數數組 exec_argv 分配內存server.exec_argv[argc] = NULL;for (j = 0; j < argc; j++) server.exec_argv[j] = zstrdup(argv[j]); // 將原始 argv 中的參數逐個復制(深拷貝)到 server.exec_argv 中

redis 的優雅重啟機制:一旦重啟時,可以直接調用 execv(server.executable, server.exec_argv) 實現“就地重啟”。

哨兵模式 sentinel

在這里插入圖片描述
我們現在就需要初始化 Sentinel,
因為在 Sentinel 模式下解析配置文件的過程中,會將需要監控的主節點信息填充到 Sentinel 的數據結構中。(所以new出來’數據結構’)

    /* We need to init sentinel right now as parsing the configuration file* in sentinel mode will have the effect of populating the sentinel* data structures with master nodes to monitor. */if (server.sentinel_mode) {	// 檢查當前 Redis 是否以哨兵模式運行(通常通過命令行參數或配置文件設置 --sentinel)initSentinelConfig(); // 初始化哨兵【配置解析】相關內容。[哨兵配置文件會描述要監控的主節點(master),以及配置項如 down-after-milliseconds、quorum 等。]initSentinel(); // 初始化哨兵運行時的核心數據結構(如監控的 master 列表等)。(結合上面的 initSentinelConfig(),最終目的是:在加載配置文件時,把其中的哨兵監控項正確寫入內存結構,準備后續運行。)}

哨兵模式介紹:
哨兵模式下,Redis 的行為和普通的主從模式不同,它主要用于自動:

  1. 監控(Monitoring):持續【檢查】主節點和從節點是否可用;(哨兵模式是基于主從結構進行監控和故障轉移的。)
  2. 通知(Notification):當某個節點不可達時,【通知】管理員或其他系統;
    (哨兵周期性地通過 PING 命令檢查主從節點的可用性。無響應就判斷為節點“主觀下線” subjectively down)
  3. 自動故障轉移(Automatic Failover):主節點宕機后,自動將某個從節點【升級】為主節點;
    (如果大多數哨兵都認為某個主節點不可達,稱為“客觀下線”(objectively down))(選舉后,哨兵更新集群配置,并通知客戶端。)
  4. 服務發現(Configuration Provider):客戶端可以通過哨兵【獲取】當前的主節點地址。

哨兵的部署架構
通常使用【多個哨兵(>=3 個)組成一個哨兵集群 + 【一個主節點(master)】 + 【多個從節點(slave)】:

sentinel.conf 中配置以告知哨兵誰是主節點:

sentinel monitor <master-name> <ip> <port> <quorum><master-name>:主節點的邏輯名稱,客戶端通過這個名字向 Sentinel 查詢主節點地址
<quorum>:判定主節點下線需要多少哨兵確認

主從模式并不一定必須帶上哨兵,但哨兵是 Redis 官方推薦的高可用方案之一。
主從模式本身沒有自動故障轉移能力。

rdb aof

在這里插入圖片描述
檢查是否需要以 redis-check-rdb 或 redis-check-aof 模式啟動。※
我們只是執行對應程序的主函數。
但是這兩個程序是 Redis 可執行文件的一部分,
因此可以方便地在加載出錯時執行 RDB 文件檢查。

就是看執不執行,如果執行,就進入相應的“檢查模式”,專門去檢測 RDB 或 AOF 文件有沒有問題。【官方的檢查工具】

    /* Check if we need to start in redis-check-rdb/aof mode. We just execute* the program main. However the program is part of the Redis executable* so that we can easily execute an RDB check on loading errors. */if (strstr(exec_name,"redis-check-rdb") != NULL)redis_check_rdb_main(argc,argv,NULL);else if (strstr(exec_name,"redis-check-aof") != NULL)redis_check_aof_main(argc,argv);

strstr(str1, str2) (string.h) 檢查str1里有沒有str2

解析命令行參數
聲明實現的位置

zsetAdd 等,聲明在server.h,實現不在server.c,而是在 t_zset.c :
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90407.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90407.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90407.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《C++》面向對象編程--類(下)

文章目錄一、賦值運算符重載1.1定義1.2基本規則1.3為什么需要運算符重載&#xff1f;1.4示例&#xff1a;二、前置和后置區別2.1前置的實現與特點2.2后置的實現與特點2.3核心區別三、const四、取地址及const取地址操作符重載4.1定義4.2語法4.3注意事項一、賦值運算符重載 1.1定…

EasyExcel 模板導出數據 + 自定義策略(合并單元格)

需求&#xff1a;數據庫里的主表明細表&#xff0c;聯查出數據并導出Excel&#xff0c;合并主表數據的單元格。代碼&#xff1a;controllerPostMapping("export")ApiOperation(value "導出數據")protected void export(ApiParam Valid RequestBody NewWms…

股指期權可以隨時平倉嗎?

本文主要介紹股指期權可以隨時平倉嗎&#xff1f;股指期權是否可以隨時平倉&#xff0c;需結合交易規則、合約狀態及市場流動性綜合判斷&#xff0c;具體如下。股指期權可以隨時平倉嗎&#xff1f;一、正常交易時間內的平倉規則在交易日的交易時段內&#xff08;如國內上證50ET…

成品電池綜合測試儀:保障電池品質與安全的核心工具|深圳鑫達能

隨著新能源汽車、儲能系統、消費電子等領域的快速發展&#xff0c;電池作為核心能源組件&#xff0c;其性能與安全性直接關系到產品的整體質量與用戶體驗。成品電池綜合測試儀作為電池生產與質檢環節的關鍵設備&#xff0c;通過模擬真實使用場景&#xff0c;對電池的電氣性能、…

智慧工廠網絡升級:新型 SD-WAN 技術架構與應用解析

1. 智慧工廠對網絡的核心需求智慧工廠的網絡需求高度復雜&#xff0c;主要體現在以下幾個方面&#xff1a;高可靠性與低延遲工廠中的生產執行系統&#xff08;MES&#xff09;、設備監控系統&#xff08;如 PLC/SCADA&#xff09;、產品生命周期管理系統&#xff08;PLM&#x…

在 Windows 使用 Nginx/HAProxy 實現負載均衡

在本實驗中&#xff0c;我們將在 Windows 系統 上使用 Python 編寫一個 TCP 服務器&#xff0c;并啟動兩個服務實例。然后使用 Nginx 或 HAProxy 作為負載均衡器&#xff0c;將來自多個客戶端的請求分發到這兩個服務實例上&#xff0c;驗證負載均衡效果。 &#x1f9e9; 環境準…

【物聯網】基于樹莓派的物聯網開發【17】——物聯網通信協議MQTT基礎知識

使用背景 MQTT最初是為了解決物聯網&#xff08;IoT&#xff09;領域設備之間的低帶寬、高延遲、不穩定網絡連接等問題而設計的。 場景介紹 廣泛應用物聯網領域&#xff0c;數據實時傳輸&#xff0c;連接各種智能設備和應用的關鍵橋梁 MQTT簡介和概述 MQTT&#xff08;Message …

【qml-3】qml與c++交互第二次嘗試(類型方式)

背景&#xff1a; 【qml-1】qml與c交互第一次嘗試&#xff08;實例方式&#xff09; 【qml-2】嘗試一個有模式的qml彈窗-CSDN博客 【qml-3】qml與c交互第二次嘗試&#xff08;類型方式&#xff09; 還是qml學習筆記。 這次擱置太久了。其實不太會&#xff0c;還是以教程為主…

輸電線路觀冰精靈在線監測裝置:科技賦能電網安全的新利器

一、技術架構與工作原理輸電線路觀冰精靈在線監測裝置&#xff08;簡稱“觀冰精靈”&#xff09;是一款集成多源感知、智能分析、遠程通信于一體的專業化覆冰監測設備。其核心功能通過以下技術路徑實現&#xff1a;1. 數據采集模塊視覺識別系統&#xff1a;搭載工業級夜視攝像機…

Ubuntu22 上,用C++ gSoap 創建一個簡單的webservice

創建calc.h// calc.h // gSOAP 服務定義 int ns__add(double a, double b, double &result); int ns__subtract(double a, double b, double &result);創建my_server.cpp#include "soapService.h" #include "ns.nsmap" class MyService : public S…

Java(LinkedList和ArrayList底層分析)

LinkedList全面說明:LinkedList底層操作機制:LinkedList的方法:add():增加節點對象remove():刪除一個節點對象(默認刪除第一個節點對象)set():修改一個節點對象get():得到一個節點對象LinkedList的遍歷:增強for循環迭代器普通for循化LinkedList的源碼解讀:增加源碼:1. LinkedLi…

開源項目XBuilder的user邏輯

stores \ userquery-keys.ts 統一管理Vue Query&#xff08;TanStack Query的Vue適配版本&#xff09;緩存鍵&#xff0c;在下面的文件中復用index.ts 入口文件&#xff0c;統一用戶信息查詢signed-in.ts 登錄狀態管理、認證邏輯在用戶登錄后&#xff0c;系統頒發一個令牌&…

第十五章 SEO的簡單免費工具

SEO的基礎工具和檢測 前文中主要是講一些SEO的網站基本功&#xff0c;而在這一章那&#xff0c;會講到一些非常基本的工具&#xff0c;主要是關于&#xff1a;網站的流量、停留時長、關鍵詞密度、內容、以及Google的站長工具。 Google Search Console Google Search Console這是…

SSL 證書與 HTTPS 的關系:一文理清核心關聯

HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;和 SSL 證書&#xff08;Secure Sockets Layer Certificate&#xff09;是網絡安全的兩大基石&#xff0c;它們共同保障了互聯網通信的安全性和可信度。以下從定義、功能、關系及實際應用層面進行解析&#xf…

使用Jmeter參數化實現接口自動化測試

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 本文記錄如何使用Jmeter參數化&#xff08;csv)實現接口自動化——測試Token不同入參情況下&#xff0c;接口請求能夠返回正確的結果1. 首先需要使用Jmeter獲取一個…

X-plore File Manager v4.34.02 修改版:安卓設備上的全能文件管理器

在使用安卓設備時&#xff0c;文件管理是日常操作中不可或缺的一部分。X-plore File Manager 作為一款功能強大的文件管理器&#xff0c;憑借其豐富的功能和便捷的操作&#xff0c;成為安卓用戶管理文件的首選工具之一。最新版 v4.34.02 修改版更是解鎖了更多高級功能&#xff…

React+threejs兩種3D多場景渲染方案

在現代 Web 開發中&#xff0c;3D 可視化需求日益增長&#xff0c;特別是在 React 生態系統中實現多 3D 場景的展示與交互。本文通過對比兩種實現方案&#xff0c;探討 React 中構建多 3D 場景的最佳實踐&#xff0c;分析它們的技術特點、性能表現和適用場景。方案一&#xff1…

React性能優化終極指南:memo、useCallback、useMemo全解析

掌握 React.memo、useCallback、useMemo 的正確使用姿勢&#xff0c;讓你的 React 應用性能飛起來&#xff01; &#x1f3af; React.memo 作用 React.memo 是一個高階組件&#xff0c;用于函數組件&#xff0c;通過淺比較 props 的變化來決定是否重新渲染。如果 props 沒有變…

借助 VR 消防技術開展應急演練,檢驗完善應急預案?

應急演練是企業應對火災事故的重要手段&#xff0c;而 VR 消防技術的應用&#xff0c;為應急演練帶來了全新的體驗和更高的效率。VR 消防技術通過虛擬現實技術模擬逼真的火災場景&#xff0c;讓參與者能夠身臨其境地感受火災發生時的緊張氛圍。某知名物流企業&#xff0c;倉庫眾…

【電賽學習筆記】MaxiCAM 項目實踐——二維云臺追蹤指定目標

前言 本文是對視覺模塊MaixCam實現二維云臺人臉跟蹤_嗶哩嗶哩_bilibili大佬的項目實踐整理與拓展&#xff0c;侵權即刪。 單路舵機基本控制 #導入必要模塊 from maix import pwm, time , pinmap#定義全局變量&#xff0c;設初值 SERVO_FREQ 50 #主頻 SERVO_MIN_DUT…