Redis一個命令請求從發送到完成的步驟以及初始化服務器步驟

一個命令請求從發送到完成的步驟

如下:
1、客戶端將命令請求發送給服務器

  • 當用戶在客戶端中鍵入一個命令請求時,客戶端會將這個命令請求轉換成協議格式,然后通過連接到服務器的套接字,將協議格式的命令請求發送給服務器。

2、服務器讀取命令請求,并分析出命令參數

  • 讀取套接字中協議格式的命令請求,將其保存到客戶端狀態的輸入緩沖區中
  • 對輸入緩沖區中的命令請求進行解析,提取出命令參數以及命令參數的個數,保存到客戶端狀態的argv屬性與argc屬性
  • 調用命令執行器,執行指定指令

3、命令執行器根據參數查找命令的實現函數,然后執行實現函數并得到命令回復

  • 根據客戶端狀態的argv[0]參數,在命令表中查找參數所指定的命令,并將找到的命令保存到客戶端狀態的cmd屬性里
  • 執行預備操作,確保命令可以正確執行(一些檢查操作)
  • 將客戶端狀態指針作為參數傳入實現函數,進行執行
  • 執行后續工作
    • 若開啟了慢查詢日志功能,模塊會檢查是否需要給剛剛執行完的命令添加一條慢查詢日志
    • 若開啟了AOF持久化,模塊會將剛剛執行的命令請求寫入到AOF緩沖區中
    • 如果有從服務器正在復制當前服務器,將剛剛執行的命令傳播給所有從服務器

4、服務器將命令回復返回給客戶端

  • 命令回復一開始保存在客戶端狀態的輸出緩沖區里,并為客戶端的套接字關聯命令回復處理器
  • 當客戶端套接字變為可寫狀態時,服務器會執行命令回復處理器,將保存在客戶端輸出緩沖區的命令回復發送給客戶端
  • 命令回復發送完畢,回復處理器清空客戶端狀態的輸出緩沖區
  • 客戶端結收到協議格式的命令回復后,解析并打印

初始化服務器步驟

1、初始化服務器狀態
創建struct redisServer類型的實例變量,server作為服務器的狀態,并為結構中的各個屬性設置默認值
例如:

設置服務器的運行ID
設置服務器的默認運行頻率
設置服務器的默認配置文件路徑
設置服務器的運行架構
設置服務器的默認端口號
設置服務器的默認RDB持久化條件和AOF持久化條件
初始化服務器的LRU時鐘 創建命令表

2、載入服務器配置
3、初始化服務器數據結構
除了命令表之外,服務器狀態還包含其他數據結構

  • server.clients鏈表,記錄了所有與服務器相連的客戶端的狀態結構,鏈表的每個節點都包含了一個redisClient結構實例
  • server.db數組,數組中包含了服務器的所有數據庫
  • server.pubsub_channels,用于保存頻道訂閱信息的字典
  • server.pubsub_patterns,用于保存模式訂閱信息的鏈表
  • servber.lua,用于執行Lua腳本的Lua環境
  • server.slowlog,用于保存慢查詢日志
    之后調用initServer函數,為數據結構分配內存,并且設置初始化值(通過配置文件的參數)
    當然該函數還進行了一些更加重要的操作:
  • 為服務器設置進程信號處理器
  • 創建共享對象,之后服務器將通過重用共享對象來避免反復創建相同的對象
  • 打開服務器的監聽端口,并為監聽套接字關聯連接應答事件處理器,等待服務器正式運行時接收客戶端的連接
  • 創建時間事件
  • 若AOF持久化功能開啟,那么打開現有的AOF文件,若文件不存在,新建一個
  • 初始化服務器后臺的I/O模塊

4、還原數據庫狀態

  • 如果啟用了AOF持久化功能,用AOF文件還原數據庫狀態
  • 否則,使用RDB文件還原

5、執行事件循環

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

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

相關文章

c打印行號和函數_使用C中的函數名稱,行號從任何函數打印錯誤消息

c打印行號和函數Sometimes, it is necessary to print some message on logic failure or anytime with the function name and line number, so that program can be debugged and fixed the issue. 有時,有必要在邏輯故障時或在任何時候使用功能名稱和行??號打印…

Linux SPI框架

水平有限,描述不當之處還請指出,轉載請注明出處http://blog.csdn.net/vanbreaker/article/details/7733476 Linux的SPI子系統采用主機驅動和外設驅動分離的思想,首先主機SPI控制器是一種平臺設備,因此它以platform的方式注冊進內…

dbms標識符無效_DBMS中的嵌套查詢,相關的嵌套查詢和集合比較運算符

dbms標識符無效嵌套查詢 (Nested Queries) A query embedded in a query. This type of relation is termed as Nested Query and the Embedded Query is termed as a subquery. 查詢中嵌入的查詢。 這種類型的關系稱為嵌套查詢,而嵌入式查詢稱為子查詢。 For exam…

重構——解決過長參數列表(long parameter list)

目錄1、Replace Param with Query2、Preserve Whole Object3、Introduce Param Object4、Remove Flag Argument5、Combine Functions into ClassReference當我們需要在超長函數中提煉子函數時,如果函數內有大量的參數和臨時變量,這將會對函數的提煉形成很…

C# 點點滴滴: out和ref

用c#很長一段時間了,不過基本是啥都不會,當C用的,作為寫單片機的,還是真心覺得C比較親切,呵呵。 不過總是要進步啊,慢慢積累唄,這次是寫一個CAN的上位機模板出來,以后的項目就要徹底…

css控制圖片最寬 最高值

.content img{width:expression_r(this.width > 500 && this.height < this.width ? 500:true);max-width:500px;height:expression_r(this.height >500 ? 500:true);max-height:500px; }轉載于:https://www.cnblogs.com/panlin/archive/2013/01/06/2848017…

踩踩踩

http://china.findlaw.cn/laodongfa/ctjg/cy/cybc/ 二、合法裁員經濟補償標準的計算 按照《勞動合同法》第四十七條規定&#xff0c;經濟補償按勞動者在本單位工作的年限&#xff0c;每滿一年支付一個月工資的標準向勞動者支付。六個月以上不滿一年的&#xff0c;按一年計算;不…

c# 字節十六進制轉十進制_用C中的十進制,八進制和十六進制數字初始化字節數組...

c# 字節十六進制轉十進制C中的字節數組 (byte array in C) In C programming language, an unsigned char type can be used to declare byte array in C programming language. An unsigned char can contain a value from 0 to 255, which is the value of a byte. 在C編程語…

從uptime、stress、mpstat、pidstat觀察CPU密集型、IO密集型、進程密集型切換的系統性能

uptime dyydyy-Lenovo-ThinkBook-14-IIL:~$ uptime10:27:10 up 7 min, 1 user, load average: 1.32, 0.99, 0.49結果分別對應&#xff1a;當前時間、系統運行時間、當前用戶數目、過去 1 分鐘、5 分鐘、15 分鐘的平均負載(Load Average) 平均負載是指單位時間內&#xff0c…

解析和創建xml

http://www.cnblogs.com/Li-Cheng/p/3610474.html 轉載于:https://www.cnblogs.com/mxw272618/p/3769900.html

python - VirtualEnv virtualenvwrapper

VirtualEnv 是什么 VirtualEnv用于在一臺機器上創建多個獨立的python運行環境&#xff0c;VirtualEnvWrapper為前者提供了一些便利的命令行上的封裝。 為什么要用 - 隔離項目之間的第三方包依賴&#xff0c;如A項目依賴django1.2.5&#xff0c;B項目依賴django1.3。- 為部署應用…

多臺計算機共享內存_共享內存多處理器和指令執行| 計算機架構

多臺計算機共享內存共享內存多處理器 (Shared Memory Multiprocessor) There are three types of shared memory multiprocessor: 共有三種類型的共享內存多處理器&#xff1a; UMA (Uniform Memory Access) UMA(統一內存訪問) NUMA (Non- uniform Memory Access) NUMA(非統一…

htop與atop

htop htop使用詳解–史上最強 atop Linux atop監控工具部署

js未看的文章

Web前端研發工程師編程能力飛升之路 在瀏覽器的背后&#xff08;一&#xff09; —— HTML語言的詞法解析 組件化的前端開發流程 用js書寫UI組件之js基礎知識 GC與JS內存泄漏 藍色理想之前端開發 w3c JavaScript Puzzlers react AngularJS入門教程 jQuery源碼分析-如何做jQuery…

方法重寫,隱藏在子類父類中的各種調用實踐

一.子類和父類方法之間的關系 1.當子類和父類有方法完全相同的方法 namespace ConsoleApplication2 {class Program{static void Main(string[] args){B b new B();A a new A();A c new B();b.Show();a.Show();c.Show();Console.Read();}}public class A{public void Show()…

向量余弦值python_向量/矩陣的余弦值打印(元素明智的操作) 使用Python的線性代數

向量余弦值pythonPrerequisite: 先決條件&#xff1a; Defining a Vector 定義向量 Defining a Matrix 定義矩陣 Numpy is the library of function that helps to construct or manipulate matrices and vectors. The function numpy.cos(x) is a function used for generati…

centos 6.5網卡dhcp不能獲得網關

環境:vmware centos6.5 添加兩個虛擬網卡。一個自動獲取ip(用于上網-橋接) 一個手動(與主機通信用于ssh-NAT)。 因為自已手動改了一下ifcfg-eth0里面的HWADDR地址。造成 eth0網卡不能識別。多出一個eth2的網卡。 配置eth2網卡&#xff0c;可以自動獲取到ip地址 但用netstat -r…

CPU上下文切換(系統調用、進程上下文、線程上下文、中斷上下文)

CPU寄存器&#xff0c;與程序計數器&#xff08;存儲CPU正在執行的指令位置&#xff0c;或者即將執行的下一條指令的位置&#xff09;共同組成CPU上下文。 CPU上下文切換指的是&#xff1a;把前一個任務的CPU上下文保存起來&#xff0c;然后加載新任務的上下文到這些寄存器和程…

(解決)從同事那里取來的工程不能編譯運行,出現以下錯誤,求幫助

錯誤 6 未能從程序集 C:\Program Files (x86)\MSBuild\Microsoft\Silverlight for Phone\v4.0\Microsoft.Phone.Build.Tasks.dll 加載任務“Microsoft.Phone.Build.Tasks.ValidateWMAppManifest”。 Could not load file or assembly Microsoft.Build.Utilities, Version2.0.0…

編程 小數位數_使用動態編程的n位數的非遞減總數

編程 小數位數Problem statement: 問題陳述&#xff1a; Given the number of digits n, find the count of total non-decreasing numbers with n digits. 給定位數n &#xff0c;找到具有n位數字的非遞減總數。 A number is non-decreasing if every digit (except the fir…