【Redis技術進階之路】「原理分析系列開篇」分析客戶端和服務端網絡誦信交互實現(服務端執行命令請求的過程 - 初始化服務器)

服務端執行命令請求的過程

  • 【專欄簡介】
    • 【技術大綱】
    • 【專欄目標】
    • 【目標人群】
      • 1. Redis愛好者與社區成員
      • 2. 后端開發和系統架構師
      • 3. 計算機專業的本科生及研究生
  • 初始化服務器
    • 1. 初始化服務器狀態結構
      • 初始化`RedisServer`變量
    • 2. 加載相關系統配置和用戶配置參數
      • 定制化配置參數
        • 案例分析
          • 更新服務端口號
          • 更新數據庫個數
      • 配置覆蓋總結
    • 3. 創建和初始化對應的對象結構實例
      • initServer初始化服務器
      • 創建和修改內存數據結構
        • initServer分配內存對象
  • 總結介紹
    • 載入RDB文件或者AOF文件

【專欄簡介】

隨著數據需求的迅猛增長,持久化和數據查詢技術的重要性日益凸顯。關系型數據庫已不再是唯一選擇,數據的處理方式正變得日益多樣化。在眾多新興的解決方案與工具中,Redis憑借其獨特的優勢脫穎而出。

【技術大綱】

為何Redis備受矚目?原因在于其學習曲線平緩,短時間內便能對Redis有初步了解。同時,Redis在處理特定問題時展現出卓越的通用性,專注于其擅長的領域。深入了解Redis后,您將能夠明確哪些任務適合由Redis承擔,哪些則不適宜。這一經驗對開發人員來說是一筆寶貴的財富。
在這里插入圖片描述

在這個專欄中,我們將專注于Redis的6.2版本進行深入分析和介紹。Redis 6.2不僅是我個人特別偏愛的一個版本,而且在實際應用中也被廣泛認為是穩定性和性能表現都相當出色的版本

【專欄目標】

本專欄深入淺出地傳授Redis的基礎知識,旨在助力讀者掌握其核心概念與技能。深入剖析了Redis的大多數功能以及全部多機功能的實現原理,詳細展示了這些功能的核心數據結構和關鍵算法思想。讀者將能夠快速且有效地理解Redis的內部構造和運作機制,這些知識將助力讀者更好地運用Redis,提升其使用效率。

將聚焦于Redis的五大數據結構,深入剖析各種數據建模方法,并分享關鍵的管理細節與調試技巧。

【目標人群】

Redis技術進階之路專欄:目標人群與受眾對象,對于希望深入了解Redis實現原理底層細節的人群

1. Redis愛好者與社區成員

Redis技術有濃厚興趣,經常參與社區討論,希望深入研究Redis內部機制、性能優化和擴展性的讀者。

2. 后端開發和系統架構師

在日常工作中經常使用Redis作為數據存儲和緩存工具,他們在項目中需要利用Redis進行數據存儲、緩存、消息隊列等操作時,此專欄將為他們提供有力的技術支撐。

3. 計算機專業的本科生及研究生

對于學習計算機科學、軟件工程、數據分析等相關專業的在校學生,以及對Redis技術感興趣的教育工作者,此專欄可以作為他們的學習資料和教學參考。

無論是初學者還是資深專家,無論是從業者還是學生,只要對Redis技術感興趣并希望深入了解其原理和實踐,都是此專欄的目標人群和受眾對象

讓我們攜手踏上學習Redis的旅程,探索其無盡的可能性!


初始化服務器

Redis服務器自啟動至具備處理客戶端命令請求的能力,需經歷一系列嚴謹的初始化與配置環節

其中涵蓋了初始化服務器運行狀態加載用戶設定的配置參數、構建必要的數據結構體系以及建立網絡通信連接等關鍵步驟。接下來,將對Redis服務器完整的初始化流程展開細致闡述。
在這里插入圖片描述


1. 初始化服務器狀態結構

初始化服務器的第一步就是創建一個結構體structredisServer類型的實例變量作為服務器的狀態,并為結構中的各個屬性設置默認值。

初始化RedisServer變量

初始化RedisServer變量的工作由redis.c/initServerConfig函數完成,以下是這個函數最開頭的一部分代碼:

void initserverConfig(void){//設置服務器的運行id getRandomHexChars(server.runid,REDIS_RUN_ID_SIZE)//為運行id加上結尾字符 server.runid[REDIS_RUN_ID_SIZE] = '\0';//設置默認配置文件路徑 server.configfile = NULL;//設置默認服務器頻串 server.hz = REDIS_DEFAULT_HZ;//設置服務器的運行架構 server.arch_bits = (sizeof (long) == 8 )64 32;//設置默認服務器端口號 server.port = REDIS_SERVERPORT;
}

以下是initServerConfig函數完成的主要工作:

注意,initServerConfig函數沒有創建服務器狀態的其他數據結構,數據庫、慢查詢日志、Lua環境、共享對象這些數據結構在之后的步驟才會被創建出來。

initServerConfig函數執行完畢之后,服務器就可以進人初始化的第二個階段一載人配置選項。


2. 加載相關系統配置和用戶配置參數

在啟動服務器時,用戶可以通過給定配置參數或者指定配置文件來修改服務器的默認配置。舉個例子,如果我們在終端中輸人

定制化配置參數

$ \redis-server --port 10086

那么我們就通過給定配置參數的方式,修改了服務器的運行端口號。另外,如果我們在終端中輸人:

$ \redis-server redis.conf

并且redis.conf文件中包含以下內容:

#將服務器的數據庫數量設置為32個 
databases 32
#關閉RDB文件的壓縮功能 
rdbcompression no

那么我們就通過指定配置文件的方式修改了服務器的數據庫數量,以及RDB持久化模塊的壓縮功能。

服務器在用initServerConfig函數初始化完server變量之后,就會開始載人用戶給定的配置參數和配置文件,并根據用戶設定的配置,對server變量相關屬性的值進行修改。

案例分析

例如,在初始化server變量時,程序會為決定服務器端口號的port屬性設置默認值

void initServerconfig(void){//默認值為6379 server.port=REDIS_SERVERPORT;
}
更新服務端口號

如果用戶在啟動服務器時為配置選項port指定了新值10086($ redis-server --port 10086),那么server. port屬性的值就會被更新為10086,這將使得服務器的端口號從默認的6379變為用戶指定的10086。

更新數據庫個數

如果用戶在啟動服務器時為選項databases設置了值32,那么server. dbnum屬性的值就會被更新為32,這將使得服務器的數據庫數量從默認的16個變為用戶指定的32個。

配置覆蓋總結

在這里插入圖片描述
服務器在載入用戶指定的配置選項,并對server狀態進行更新之后,服務器就可以進人初始化的第三個階段一初始化服務器數據結構。


3. 創建和初始化對應的對象結構實例

在之前執行initServerConfig函數初始化server狀態時,程序只創建了命令表一個數據結構,不過除了命令表之外,服務器狀態還包含其他數據結構,比如:

  • server.clients(鏈表):記錄了與服務器相連的客戶端的狀態結構,每個節點包含redisclient結構實例
  • server.db(數組):包含了服務器的所有數據庫。
  • server.pubsub channels(字典):保存頻道訂閱信息,以及保存模式訂閱信息的server,pubsub_patterns鏈表。
  • server.lua:執行Lua腳本的Lua環境
  • server.slowlog:慢查詢日志的屬性

initServer初始化服務器

初始化服務器進行到這一步,服務器將調用initServer函數,為以上提到的數據結構分配內存,并在有需要時,為這些數據結構設置或者關聯初始化值。

注意,服務器到現在才初始化數據結構的原因在于,服務器必須先載入用戶指定的配置選項,然后才能正確地對數據結構進行初始化

創建和修改內存數據結構

如果在執行initServerConfig函數時就對數據結構進行初始化,那么一旦用戶通過配置選項修改了和數據結構有關的服務器狀態屬性,服務器就要重新調整和修改已創建的數據結構。

為了避免出現這種麻煩的情況,服務器選擇了將server狀態的初始化分為兩步進行:

  • initServerConfig函數主要負責初始化屬性
  • initserver函數主要負責初始化數據結構
initServer分配內存對象
  • 創建進程信號處理器
  • 創建共享復用對象
    • Redis服務器常用的值,像表示 “OK” 回復、“ERR” 回復的字符串對象,以及對應整數1到10000的字符串對象等。服務器復用這些共享對象,避免重復創建相同對象。
  • 創建事件監聽器
    • 監聽套接字關聯連接應答事件處理器,待服務器正式運行時接收客戶端連接。
  • 創建時間事件
    • 同時為 serverCron 函數創建時間事件,待服務器運行時執行該函數。
  • 載入AOF文件數據
    • 若AOF持久化功能已開啟,打開現有的AOF文件;若文件不存在,則創建并打開新的 AOF 文件,為 AOF 寫入操作做準備。
  • 建立I/O處理器模塊
    • 初始化服務器的后臺I/O模塊,為后續的 I/O 操作做好準備。

總結介紹

serverCron函數默認每隔100毫秒執行一次,它的工作主要包括更新服務器狀態信息,處理服務器接收的SIGTERM信號,管理客戶端資源和數據庫狀態,檢查并執行持久化操作等等。

命令請求從發送到完成主要包括以下步驟:
在這里插入圖片描述
服務從啟動到能夠處理客戶端的求需要執行以下步驟:
在這里插入圖片描述

載入RDB文件或者AOF文件

服務器依據文件記錄還原數據庫狀態,具體方式取決于AOF持久化功能是否啟用:若啟用,使用AOF文件還原;若未啟用,則使用RDB文件。完成數據庫狀態還原后,服務器會在日志中記錄文件載入及狀態還原耗時。

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

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

相關文章

VB.net復制Ntag213卡寫入UID

本示例使用的發卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、讀取舊Ntag卡的UID和數據 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click輕松讀卡技術支持:網站:Dim i, j As IntegerDim cardidhex, …

SQL SERVER 數據庫遷移的三種方法!

要將SQL Server從研發環境的把數據庫結構(不含數據)遷移至生產環境,可通過以下幾種方法實現。以下是具體操作步驟及適用場景: ?? 一、使用SSMS圖形界面生成結構腳本(推薦新手) 通過SQL Server Management Studio的生成腳本向導,僅導出數據庫架構: ??連接測試庫??…

C# 快速檢測 PDF 是否加密,并驗證正確密碼

引言:為什么需要檢測PDF加密狀態? 在批量文檔處理系統(如 OCR 文字識別、內容提取、格式轉換)中,加密 PDF 無法直接操作。檢測加密狀態可提前篩選文件,避免流程因密碼驗證失敗而中斷。 本文使用 Free Spire…

(33)課54:3 張表的 join-on 連接舉例,多表查詢總結。數據庫編程補述及游標綜合例題。靜態 sqL與動態sqL(可帶參數)

(112)3 張表的 join-on 連接舉例 : (113) 多表查詢總結 : (114)數據庫編程補述 : 綜合例題 : 以上沒有動手練習,不知道這樣的語法是否…

再見 Navicat!一款開源的 Web 數據庫管理工具!

大家好,我是 Java陳序員。 在日常的開發工作中,常常需要與各種數據庫打交道。而為了提高工作效率,常常會使用一些可視化工具進行操作數據庫。 今天,給大家介紹一款開源的數據庫管理工具,無需下載安裝軟件&#xff0c…

OkHttp 中實現斷點續傳 demo

在 OkHttp 中實現斷點續傳主要通過以下步驟完成,核心是利用 HTTP 協議的 Range 請求頭指定下載范圍: 實現原理 Range 請求頭:向服務器請求文件的特定字節范圍(如 Range: bytes1024-) 本地文件記錄:保存已…

函數中的Callable

在編程中,?Callable(可調用對象)?? 是指任何可以通過 () 操作符調用的對象。在函數和類設計的上下文中,Callable 通常指代可以被調用的實體,例如函數、方法、Lambda表達式或實現了 __call__ 方法的對象。以下是詳細…

MySQL學習之觸發器

文章目錄 前言什么是觸發器(Trigger)?觸發器的特點 MySQL中觸發器的用法創建NEW 與 OLD舉例其他操作 注意事項后續內容參考目錄 前言 閱讀本文前請注意最后編輯時間,文章內容可能與目前最新的技術發展情況相去甚遠。歡迎各位評論…

AIGC 基礎篇 Python基礎 04 for循環與while循環

今天,我們來講Python里面的循環部分 1.for循環 for i in range(1,10,2):print(i) 這是一個簡單但是完整的for循環,里面包含了for循環的所有結構 首先注意格式是“for 變量 in range(取得到的起始值,取不到的終點值,步長)” …

安寶特方案丨XRSOP人員作業標準化管理平臺:AR智慧點檢驗收套件

在選煤廠、化工廠、鋼鐵廠等過程生產型企業,其生產設備的運行效率和非計劃停機對工業制造效益有較大影響。 隨著企業自動化和智能化建設的推進,需提前預防假檢、錯檢、漏檢,推動智慧生產運維系統數據的流動和現場賦能應用。同時,…

每日算法 -【Swift 算法】三數之和最接近目標值

?? Swift 實現:三數之和最接近目標值(3Sum Closest) ? 前言 在算法學習過程中,經典的“三數之和”系列題目是很多人通往進階路上的一道坎。今天我們來介紹其中一個非常實用的變種問題 —— 三數之和最接近目標值(3Sum Closest),并使用 Swift 實現一個高效的解法。 …

python打卡day50@浙大疏錦行

知識點回顧: resnet結構解析CBAM放置位置的思考針對預訓練模型的訓練策略 差異化學習率三階段微調 ps:今日的代碼訓練時長較長,3080ti大概需要40min的訓練時長 作業: 好好理解下resnet18的模型結構嘗試對vgg16cbam進行微調策略 R…

虛幻引擎5-Unreal Engine筆記之SET節點的輸出引腳獲取設置后的最新變量值

虛幻引擎5-Unreal Engine筆記之SET節點的輸出引腳獲取設置后的最新變量值 code review! 一個變量的“SET”節點 retrieve 是動詞,意思是“檢索、獲取、取回”。 retrieves 只是當主語是第三人稱單數(比如 he、she、it 或單個人/物)時使用的…

編譯原理實驗 之 TINY 解釋測試目標代碼

文章目錄 實驗任務1任務2 本次的實驗是在前三次TINYC的基礎上的一個測試,所以完成前三次的實驗是基礎 編譯原理 之 實驗一 編譯原理實驗 之 Tiny C語言編譯程序實驗 語法分析 編譯原理實驗 之 TINY 之 語義分析(第二次作業 首先將新的文件復制到先前的…

CanFestival移植到STM32G4

文章目錄 一、準備工作二、軟件配置三、移植CanFestival參考 一、準備工作 1、獲取Canfestival源碼 2、Python下載 3、wxPython下載 4、CanFestival字典生成 5、安裝參考 Python2.7.15及wxPython2.8百度云盤下載地址:https://pan.baidu.com/s/1bRS403m4B31m4ovSJ-_…

iOS性能調優實戰:借助克魔(KeyMob)與常用工具深度洞察App瓶頸

在日常iOS開發過程中,性能問題往往是最令人頭疼的一類Bug。尤其是在App上線前的壓測階段或是處理用戶反饋的高發期,開發者往往需要面對卡頓、崩潰、能耗異常、日志混亂等一系列問題。這些問題表面上看似偶發,但背后往往隱藏著系統資源調度不當…

第十三章 RTC 實時時鐘

第十三章 RTC 實時時鐘 目錄 第十三章 RTC 實時時鐘 1 RTC簡介 1.1 主要特性 2 功能描述 2.1 概述 2.2 復位過程 2.3 讀RTC寄存器 2.4 配置RTC寄存器 2.5 RTC標志的設置 3 RTC寄存器描述 3.1 RTC控制寄存器高位(RTC_CRH) 3.2 RTC控制寄存器低位(RTC_CRL) 3.3 RTC預…

618來了,推薦京東云服務器

2核2G3M,49元/1年,348元/3年 2核4G5M,149元/1年,518元/3年 4核8G5M,368元/1年,1468元/3年 8核16G5M,1258元/1年,3498元/3年 8核32G10M,1498元/1年,4268元/3年 活動地址:https://3.cn/2hT-F6AX

數據庫邏輯刪除,唯一性約束究極解決方案

文章目錄 一、寫在前面二、解決方案1、業務邏輯層面控制2、物理刪除數據歸檔3、is_delete !0的都認為是刪除(推薦)4、MySQL 函數索引(表達式索引)(需 MySQL 8.0)(推薦)5、部分索引&a…

3-存儲系統

一-基本概念 二-主存儲器 三-主存儲器與CPU的連接 四-外部存儲器 五-高速緩沖存儲器 六-虛擬存儲器