redis 系列19 客戶端

来源:https://www.cnblogs.com/MrHSR/archive/2018/12/03/10059762.html
-Advertisement-
Play Games

一. 概述 Redis伺服器是可以與多個客戶端建立網路連接,每個客戶端可以向伺服器發送命令請求,而伺服器則接收並處理客戶端發送的命令請求,並向客戶端返回命令回覆。通過使用I/O多路復用技術實現的文件事件處理器,Redis伺服器使用單進程單線程的方式來處理命令請求,並與多個客戶端進行網路通信。 1.1 ...


一. 概述

  Redis伺服器是可以與多個客戶端建立網路連接,每個客戶端可以向伺服器發送命令請求,而伺服器則接收並處理客戶端發送的命令請求,並向客戶端返回命令回覆。通過使用I/O多路復用技術實現的文件事件處理器,Redis伺服器使用單進程單線程的方式來處理命令請求,並與多個客戶端進行網路通信。

  1.1 偽客戶端和普通客戶端

    對於每個與伺服器進行連接的客戶端,伺服器都為這些客戶端建立了相應的redis.h/redisClient結構(客戶端狀態),這個結構保存了客戶端當前的狀態信息。根據客戶端類型的不同,分為偽客戶端和普通客戶端。偽客戶端處理的命令請求來源於AOF文件或者Lua腳本,而不是網路,這種客戶端不需要套接字連接。普通客戶端使用套接字與伺服器進行通信,下麵腳本顯示了全部的普通客戶端:

    127.0.0.1:6379> client list
    id=2 addr=127.0.0.1:45090 fd=8 name= age=95 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
    id=3 addr=127.0.0.1:45092 fd=9 name= age=3 idle=3 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=command

  上面腳本,當fd為-1時,就是一個偽客戶端。普通客戶端的fd都大於0。name代表客戶端名稱,預設為空,可以用client setname命令來設置一個客戶端的名字,例如給當前客戶端設置名稱,以下腳本:

    127.0.0.1:6379> client setname client1
    OK
    127.0.0.1:6379> client list
    id=2 addr=127.0.0.1:45090 fd=8 name=client1 age=414 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 
   events=r cmd=client id=3 addr=127.0.0.1:45092 fd=9 name= age=322 idle=322 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0
  events=r cmd=command

  

  1.2  flags標誌

    flags記錄了客戶端的角色(role),以及客戶端目前所處的狀態,flags屬性的值可以是單個標誌,也可以是多個標誌的二進位。客戶端 flag 可以由以下部分組成:

屬性值

描述

O

客戶端是 MONITOR 模式下的附屬節點(slave)

S

客戶端是一般模式下(normal)的附屬節點

M

客戶端是主節點(master)

x

客戶端正在執行事務

b

客戶端正在等待阻塞事件

i

客戶端正在等待 VM I/O 操作(已廢棄

c

在將回覆完整地寫出之後,關閉鏈接

u

客戶端未被阻塞(unblocked)

N

未設置任何 flag

r

客戶端套接字(在事件 loop 中)是可讀的(readable)

w

客戶端套接字(在事件 loop 中)是可寫的(writeable)

  

  1.3 輸入緩衝區qbuf 與輸出緩衝區 obl  

    (1)客戶端狀態的輸入緩衝區用於保存客戶端發送的命令請求,如set key value, 輸入緩衝區的大小會根據輸入內容動態地縮小或擴大,但它的最大空間不超過1GB,否則伺服器將關閉這個客戶端。

    (2)當服務端執行命令回覆,會被保存在客戶端狀態的輸出緩衝區中,每個客戶端都有兩個輸出緩衝區可用,一個緩衝區大小是固定的,另一個緩衝區的大小是可變的。固定大小的緩衝區用於保存回覆信息長度比較小的,比如OK,簡短的字元串值,整數值,錯誤回覆等。可變大小的緩衝區用於保存長度比較大的,比如一個非常長的字元串值,或一個由很多項組成的列表,或一個包含了很多元素的集合等。 固定大小的緩衝區預設為16kb。可變大小緩衝區不能超過伺服器設置的硬性限制值,本篇最後client-output-buffer-limit時有講。 omem表示輸出緩存的記憶體占用量。

  

  1.4 身份驗證

    客戶端狀態的authenticated屬性用於記錄客戶端是否通過了身份驗證,當redisClinet結構下的authenticated屬性為值0時,代表客戶端未通過身份驗證,安裝redis服務後,預設是沒有密碼,也就是不需要身份驗證,通過設置config set requirepass  xxx 來設置密碼。通過auth  xx來驗證密碼是否正確。下麵腳本是設置密碼和驗證密碼是否正確:

    127.0.0.1:6379> config set requirepass 123456
    OK
    127.0.0.1:6379> auth 123456
    OK

    當沒有通過驗證時,使用ping命令顯示信息如下, 退出客戶端,重啟登錄使用-a 參數輸入密碼,再次使用ping命令,驗證成功,如下腳本:

    127.0.0.1:6379> ping
    (error) NOAUTH Authentication required.
    [root@xuegod64 ~]# redis-cli -a 123456
    127.0.0.1:6379> ping
    PONG

 

  1.5 時間

    客戶端還有幾個和時間有關的屬性,一是age屬性,它記錄了創建客戶端的時間,這個時間可以用來計算客戶端與伺服器已經連接了多少秒。二是idle空轉時間,即客戶端與伺服器最後一次進行互動以來,已經過去了多少秒。

 

  1.6 客戶端的創建與關閉

    如果客戶端是通過網路連接與伺服器進行連接的普通客戶端,那麼在客戶端使用connect函數連接到伺服器時,伺服器就會調用連接事件處理器(上篇簡單講到的文件事件處理器),為客戶端創建相應的客戶端狀態,並將這個新狀態添加到伺服器狀態結構reddisServer結構的clients數組鏈表的末尾。對於關閉普通客戶端,人為可以使用clinet kill命令,來關閉,如下腳本所示:

    127.0.0.1:6379> client list
    id=4 addr=127.0.0.1:45094 fd=8 name= age=6141 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
    id=6 addr=127.0.0.1:45098 fd=9 name= age=5966 idle=22 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
    127.0.0.1:6379> client kill id 6
    (integer) 1
    127.0.0.1:6379> client list
    id=4 addr=127.0.0.1:45094 fd=8 name= age=6179 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client 

    如果用戶為伺服器設置了timeout選項,那麼當客戶端的空轉時間(idle)超過timeout選項設置的值時,客戶端將關閉。如果輸入緩衝區占用空間超過1GB時,客戶端將關閉。

    對於輸出緩衝區的大小,達到限制時,客戶端也將關閉。為了避免客戶端的回覆過大,占用過多的伺服器資源,伺服器會時刻檢查客戶端的輸出緩衝區的大小,併在緩衝區的大小超出範圍時,執行相應的限制操作。伺服器使用兩種模式來限制客戶端輸出緩衝區的大小:

    (1) 硬性限制(hard limit):如果輸出緩衝區的大小超過了硬性限制所設置的大小,那麼伺服器立即關閉客戶端。

    (2) 軟性限制(soft limit): 如果輸出緩衝區的大小超出了軟性限制所設置的大小,並且占用的時長大於> 設置的總時長,那麼伺服器將關閉客戶端。

    使用client-output-buffer-limit選項可以為普通客戶端,從伺服器客戶端,執行發佈訂閱功能的客戶端分別設置不同的軟性限制和硬性限制,預設設置如下:

1) "client-output-buffer-limit"
2) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"

    normal是普通客戶端:軟性限制和硬性限制都沒有限制。

    slave是從伺服器客戶端:硬性限制是268435456, 軟性限制是67108864 並且時長為60秒。

    pubsub是發佈訂閱功能的客戶端: 硬性限制是33554432, 軟性限制是8388608並且時長為60秒。

 

  1.7  偽客戶端的創建與關閉

    對於Lua腳本的偽客戶端,在伺服器初始化時創建,這個偽客戶端在伺服器運行的整個生命期中會一直存在,只有伺服器關閉時,這個客戶端才會被關閉。

    對於AOF文件的偽客戶端,伺服器在載入AOF文件時,會創建偽客戶端,併在載入完成之後,關閉這個偽客戶端。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 忘記root密碼 如果不小心忘記了root密碼,那麼mysql就不能再登錄了,這時就要重置root密碼才行。通過下麵的步驟,我們可以重新設置root密碼。 1、退出mysql [root@localhost src]# service mysqld stop 停止mysqld: [確定] [root ...
  • 1. 啟動過程中的記憶體初始化 首先我們來看看start_kernel是如何初始化系統的, start_kerne定義在 "init/main.c?v=4.7, line 479" 其代碼很複雜, 我們只截取出其中與記憶體管理初始化相關的部分, 如下所示 table th:nth of type(1){ ...
  • diff 命令是 linux上非常重要的工具,用於比較文件的內容,特別是比較兩個版本不同的文件以找到改動的地方。diff在命令行中列印每一個行的改動。最新版本的diff還支持二進位文件。diff程式的輸出被稱為補丁 (patch),因為Linux系統中還有一個patch程式,可以根據diff的輸出將 ...
  • 前言:本篇博客是博主踩過無數坑,反覆查閱資料,一步步搭建完成後整理的個人心得,分享給大家~~~ 本文所需的安裝包,都上傳在我的網盤中,需要的可以打賞博主一杯咖啡錢,然後私密博主,博主會很快答覆呦~ 00.組件版本和配置策略 00-01.組件版本 Kubernetes 1.10.4 Docker 18 ...
  • (+)在等號的左邊表示右連接; (+)在等號的右邊表示左連接。 右連接 RIGHT JOIN 左連接 Left join ...
  • 上篇我們說了 SQL 的基本語法,掌握了這些基本語法後,我們可以對單表進行查詢及計算分析。但是一個大的系統,往往會有數十上百張表,而業務關係又錯綜複雜。我們要查的數據往往在好幾張表中,而要從多張表中來獲取信息就需要用到表聯結了。 先說說什麼是聯結,聯結就是用一條 SELECT 語句從多個表中查詢數據 ...
  • ***********模糊查詢*********/ 關鍵字: like (!!!!字元串類型) in (,,) 匹配()內的某個具體值(括弧里可以寫多個值) between... and.. 在某兩個值的區間範圍中(前後都包括,小的寫前面,大的寫後面) **********通配符********/ ...
  • 本文力在從oracle的基礎出發,從oracle的基礎結束,從資料庫的連接、用戶管理、sqlplus使用、plsql工具、存儲過程、函數、包、觸發器等一個DBA經常進行的操作與維護方面入手,旨在從這條最淺顯易懂的學習道路上,瞭解oracle的日常使用。相信對於初學者是個不錯的選擇,也希望自己的這篇整... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...