redis——客戶端

redis服務器是典型的一對多服務器,通過使用由IO多路復用技術實現的文件事件處理器,redis服務器使用了單線程單進程的方式來處理請求。

客戶端的屬性

描述符

客戶端狀態的?fd?屬性記錄了客戶端正在使用的套接字描述符:

typedef struct redisClient {// ...int fd;// ...
} redisClient;
  • 偽客戶端fd?值為?-1?: 偽客戶端處理的命令請求來源于 AOF 文件或者 Lua 腳本, 而不是網絡, 所以這種客戶端不需要套接字連接。
  • 普通客戶端?fd?值為大于?-1?的整數: 普通客戶端使用套接字來與服務器進行通訊, 所以服務器會用?fd?屬性來記錄客戶端套接字的描述符。?

標志

客戶端的標志屬性?flags?記錄了客戶端的角色(role), 以及客戶端目前所處的狀態:

typedef struct redisClient {// ...int flags;// ...} redisClient;

flags?屬性的值可以是單個標志:

flags = <flag>

也可以是多個標志的二進制或, 比如:

flags = <flag1> | <flag2> | ...

每個標志使用一個常量表示, 一部分標志記錄了客戶端的角色:

  • 在主從服務器進行復制操作時, 主服務器會成為從服務器的客戶端, 而從服務器也會成為主服務器的客戶端。?REDIS_MASTER?標志表示客戶端代表的是一個主服務器,?REDIS_SLAVE?標志表示客戶端代表的是一個從服務器。
  • REDIS_LUA_CLIENT?標識表示客戶端是專門用于處理 Lua 腳本里面包含的 Redis 命令的偽客戶端。

另一部分標志記錄了客戶端目前所處的狀態:

以下內容為摘抄
REDIS_MONITOR?標志表示客戶端正在執行?MONITOR?命令。REDIS_UNIX_SOCKET?標志表示服務器使用 UNIX 套接字來連接客戶端。REDIS_BLOCKED?標志表示客戶端正在被?BRPOP?、?BLPOP?等命令阻塞。REDIS_UNBLOCKED?標志表示客戶端已經從?REDIS_BLOCKED?標志所表示的阻塞狀態中脫離出來, 
不再阻塞。?REDIS_UNBLOCKED?標志只能在?REDIS_BLOCKED?標志已經打開的情況下使用。REDIS_MULTI?標志表示客戶端正在執行事務。REDIS_DIRTY_CAS?標志表示事務使用?WATCH?命令監視的數據庫鍵已經被修改,?
REDIS_DIRTY_EXEC?標志表示事務在命令入隊時出現了錯誤, 
以上兩個標志都表示事務的安全性已經被破壞, 只要這兩個標記中的任意一個被打開,?
EXEC?命令必然會執行失敗。 
這兩個標志只能在客戶端打開了?REDIS_MULTI?標志的情況下使用。REDIS_CLOSE_ASAP?標志表示客戶端的輸出緩沖區大小超出了服務器允許的范圍, 
服務器會在下一次執行?serverCron?函數時關閉這個客戶端, 
以免服務器的穩定性受到這個客戶端影響。 
積存在輸出緩沖區中的所有內容會直接被釋放, 不會返回給客戶端。REDIS_CLOSE_AFTER_REPLY?標志表示有用戶對這個客戶端執行了?CLIENT_KILL?命令, 
或者客戶端發送給服務器的命令請求中包含了錯誤的協議內容。 
服務器會將客戶端積存在輸出緩沖區中的所有內容發送給客戶端, 然后關閉客戶端。REDIS_ASKING?標志表示客戶端向集群節點(運行在集群模式下的服務器)發送了?ASKING?命令。REDIS_FORCE_AOF?標志強制服務器將當前執行的命令寫入到 AOF 文件里面,
REDIS_FORCE_REPL?標志強制主服務器將當前執行的命令復制給所有從服務器。 
執行?PUBSUB?命令會使客戶端打開?REDIS_FORCE_AOF?標志, 
執行?SCRIPT_LOAD?命令會使客戶端打開?
REDIS_FORCE_AOF標志和?REDIS_FORCE_REPL?標志。在主從服務器進行命令傳播期間, 從服務器需要向主服務器發送?REPLICATION ACK?命令, 
在發送這個命令之前, 從服務器必須打開主服務器對應的客戶端的?
REDIS_MASTER_FORCE_REPLY?標志, 否則發送操作會被拒絕執行。

以上提到的所有標志都定義在?redis.h?文件里面。

PUBSUB?命令和?SCRIPT?LOAD?命令的特殊性

通常情況下, Redis 只會將那些對數據庫進行了修改的命令寫入到 AOF 文件, 并復制到各個從服務器: 如果一個命令沒有對數據庫進行任何修改, 那么它就會被認為是只讀命令, 這個命令不會被寫入到 AOF 文件, 也不會被復制到從服務器。

以上規則適用于絕大部分 Redis 命令, 但?PUBSUB?命令和?SCRIPT_LOAD?命令是其中的例外。

PUBSUB?命令雖然沒有修改數據庫, 但?PUBSUB?命令向頻道的所有訂閱者發送消息這一行為帶有副作用, 接收到消息的所有客戶端的狀態都會因為這個命令而改變。 因此, 服務器需要使用?REDIS_FORCE_AOF?標志, 強制將這個命令寫入 AOF 文件, 這樣在將來載入 AOF 文件時, 服務器就可以再次執行相同的?PUBSUB?命令, 并產生相同的副作用。

SCRIPT_LOAD?命令的與?PUBSUB?命令類似

輸入緩沖區

客戶端狀態的輸入緩沖區用于保存客戶端發送的命令請求:

typedef struct redisClient {// ...sds querybuf;// ...} redisClient;

?redisClient 實例:

命令相關

在服務器將客戶端發送的命令請求保存到客戶端狀態的?querybuf?屬性之后, 服務器將對命令請求的內容進行分析, 并將得出的命令參數以及命令參數的個數分別保存到客戶端狀態的?argv?屬性和?argc?屬性:

typedef struct redisClient {// ...robj **argv;int argc;// ...} redisClient;

argv?屬性是一個數組, 數組中的每個項都是一個字符串對象: 其中?argv[0]?是要執行的命令, 而之后的其他項則是傳給命令的參數。

argc?屬性則負責記錄?argv?數組的長度。

實現函數

?

當服務器從協議內容中分析并得出?argv?屬性和?argc?屬性的值之后, 服務器將根據項?argv[0]?的值, 在命令表中查找命令所對應的命令實現函數。

(命令表是一個字典,字典的鍵是一個 SDS 結構, 保存了命令的名字, 字典的值是命令所對應的?redisCommand?結構, 這個結構保存了命令的實現函數、 命令的標志、 命令應該給定的參數個數、 命令的總執行次數和總消耗時長等統計信息。)

輸出緩沖區

執行命令所得的命令回復會被保存在客戶端狀態的輸出緩沖區里面, 每個客戶端都有兩個輸出緩沖區:

  • 固定大小的緩沖區用于保存那些長度比較小的回復, 比如?OK?、簡短的字符串值、整數值、錯誤回復,等等。
  • 可變大小的緩沖區用于保存那些長度比較大的回復, 比如一個非常長的字符串值, 一個由很多項組成的列表, 一個包含了很多元素的集合, 等等。

?

其它

客戶端狀態的?authenticated?屬性用于記錄客戶端是否通過了身份驗證,還有幾個和時間有關的屬性,敘述是一件挺無聊的事情,不再寫。

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

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

相關文章

矩陣論-線性空間的基與坐標,基變換坐標變換

線性空間與線性變換綜述1.1 線性空間1.1.3 線性空間的基與坐標1.1.4 基變換與坐標變換綜述 本系列博文主要總結學習矩陣論的心得筆記&#xff0c;參考數目《矩陣論》–張凱院&#xff1b;整個文章的整理體系參照行書過程。 1.1 線性空間 1.1.3 線性空間的基與坐標 向量的坐…

大數據學習(2-1)-Hadoop安裝教程-單機模式和偽分布模式(Ubuntu14.04LTS)

文章目錄目錄1.linxu的安裝1.1安裝Linux虛擬機1.2安裝Linux和Windows雙系統2.Hadoop的安裝2.1 Hadoop安裝前配置2.1.1 配置Hadoop用戶2.1.2 安裝 ssh , 配置ssh免密登錄2.1.3 安裝java環境2.2 Hadoop的安裝3.Hadoop單機版配置4.Hadoop偽分布版配置目錄 1.linxu的安裝 1.1安裝…

mysql——JDBC

概述 JDBC&#xff1a;java Data Base Connectivity ,java數據庫連接&#xff0c;它是一種用于執行sql語句的java API&#xff0c;為多種關系數據庫提供統一訪問。 其實就是一組用java編寫的類和接口。 JDBC API 提供兩類主要接口&#xff1a; 1&#xff09;面向開發人員的…

數組精選題目三連(6)

題目一&#xff1a;調整有序的arr數組&#xff0c;使得左半部分有序且不重復&#xff0c;不用保證右邊是否有序。 思路&#xff1a; u : 左邊的最后位置&#xff0c;即0---u為答案 i : 從u到右遍歷 當arr[i]和arr[u]不相等時&#…

大數據學習(2-2)- 使用docker安裝配置Hadoop環境

我的思路是這樣&#xff1a;安裝ubuntu系統---->下載docker---->在docker里拉取hadoop鏡像---->在此鏡像里創建三個容器(Master、Slave1、Slave2)---->完成完全分布式 1. 安裝ubuntu系統(無論你是安裝的單系統&#xff0c;還是用虛擬機安裝了ubuntu) 如果想安裝單…

自然語言處理(2)-信息論基礎

自然語言處理-數學基礎概述1.信息論基礎1.1熵1.2 聯合熵和條件熵1.3 相對熵和交叉熵1.4 互信息和雙字耦合度1.5 噪聲信道模型概述 本系列文章計劃總結整理中國科學院大學宗成慶老師《自然語言處理》課程相關知識&#xff0c;參考數目《統計自然語言處理》-第二版&#xff0c;宗…

servlet基礎總結

什么是servlet Servlet&#xff08;Server Applet&#xff09;是Java Servlet的簡稱&#xff0c;是小服務程序或服務連接器&#xff0c;是用Java編寫的服務器端程序&#xff0c;主要功能在于交互式地瀏覽和修改數據&#xff0c;生成動態Web內容. 狹義的Servlet是指Java語言實…

大數據學習(3)- 分布式文件系統HDFS

文章目錄目錄1.分布式文件系統1.1 計算機集群概念1.2 分布式文件系統結構2.HDFS簡介2.1 HDFS設計的目標2.2HDFS的局限性2.3 塊的概念2.4 HDFS主要組件及其功能2.4.1 名稱節點2.4.2 第二名稱節點2.4.3 數據節點3.HDFS體系結構3.1 HDFS體系結構介紹3.2 HDFS體系結構的局限性4.HDF…

Python 圖片轉簡單字符畫

字符畫是一系列字符的組合&#xff0c;我們可以把字符看作是比較大塊的像素&#xff0c;一個字符能表現一種顏色&#xff08;暫且這么理解吧&#xff09;&#xff0c;字符的種類越多&#xff0c;可以表現的顏色也越多&#xff0c;圖片也會更有層次感。 灰度值&#xff1a;指黑…

大數據學習(4)--分布式數據庫HBase

文章目錄目錄1.HBase概述1.1BigTable1.2 HBase簡介1.3 HBase和傳統的關系型數據庫之間的區別2.HBase訪問接口3.HBase數據模型3.1 數據模型概述3.2 數據模型相關概念3.3 數據坐標3.4 概念視圖3.5 物理視圖3.6 面向列的存儲4.HBase的實現原理4.1 HBase功能組件4.2 表和region4.3 …

servlet中的數據存儲

在servlet基礎中&#xff0c;我們&#xff1a; 用以下幾種方式實現數據存儲和共享&#xff1a; 1&#xff09;在客戶端頁面和服務器端程序之間&#xff0c;用request中的getParameter()方法共享數據 2&#xff09;在請求和請求之間&#xff0c;可以用get/setAttribute方法來共…

Linux(2)-tar,find,grep,xargs

常用命令1. 打包壓縮/解包解壓縮 tar1.1 打包 tar -czvf xxx.tar.gz xxx1.2 解壓 tar -xzvf xxx.tar.gz2.文件/目錄搜索2.1 find文件/目錄查找2.2 grep文本匹配3. 復合命令3.1 > 重定向3.2 | 管道.shutdown1. 打包壓縮/解包解壓縮 tar tar和gzip是對黃金搭檔&#xff1a;ta…

Event Recommendation Engine Challenge(基礎版)---代碼

第一步&#xff1a;統計user和event相關信息 #查看train_csv的數據 import pandas as pd df_train pd.read_csv(train.csv) df_train.head()usereventinvitedtimestampinterestednot_interested03044012191877122502012-10-02 15:53:05.75400000:000013044012150228424802012…

servlet——三兄弟的另外兩個:過濾器/監聽器

過濾器 我們寫多了servlet會發現&#xff0c;很多代碼和功能是重復的&#xff0c;比如&#xff1a;解決中文亂碼問題、權限驗證、日志的記錄等&#xff0c;他們的特點是&#xff1a;代碼相同或相似、分散在不同位置、不利于維護。 過濾器就是他們的解決辦法。 過濾器是請求到…

矩陣論-線性變換的特征值與特征變換

線性空間與線性變換綜述1.2 線性變換及其矩陣1.2.3 特征值與特征向量綜述 本系列博文主要總結學習矩陣論的心得筆記&#xff0c;參考數目《矩陣論》–張凱院&#xff1b;整個文章的整理體系參照行書過程。 1.2 線性變換及其矩陣 1.2.3 特征值與特征向量 本節討論如何選擇線…

Python(1)-源起、設計目標、設計哲學、特點

python簡介1. python的起源2. 解釋器3. python 語言的設計目標4. python 語言的設計哲學5. Python 特點人生苦短&#xff0c;我用python–吉多范羅蘇姆&#xff08;Guido van Rossum&#xff09;1. python的起源 1989年吉多在圣誕節想寫一個新的解釋程序作為ABC語言的繼承者。…

kaggle(05)---Event Recommendation Engine Challenge(基礎版)

文章目錄目錄1.比賽相關介紹1.1 比賽介紹1.2 數據集介紹1.3 評價標準介紹1.4 個人理解2. 解決方案2.1 統計用戶和event信息2.2 計算用戶相似度2.3 用戶社交關系信息處理2.4 構建event和event相似度數據2.5 活躍度/event熱度數據2.6 構建特征2.7 模型構建和預測3. 遇到的問題4. …

多校一道KMP+DP的題

難啊&#xff0c;多校當時根本不會做 題目描述 White Cloud has a rectangle carpet of n*m. Grid (i,j) has a color colorA[i][j] and a cost costA[i][j]. White Rabbit will choose a subrectangle B of p*q from A and the color of each grid is colorB[0...p-1][0..…