日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

Redis如何處理客戶端連接

 

客戶端的連接的建立

redis通過在TCP端口上進行監聽,或者Unix socket(如果啟用)的方式來接受客戶端的連接。當一個新的客戶端連接被接受執行以下操作:

  • 當Redis使用非阻塞I/O復用,客戶端socket設置為非阻塞狀態。
  • socket TCP_NODELAY屬性被設置確保在連接中我們不會延遲。
  • 一個 可讀的文件事件被創建,因而當新的數據可以被訪問時,Reids可以更快接收客戶端在socket上的查詢

當客戶端初始化后,Redis檢查我們是否還在它可以同時處理的客戶端的數量限制范圍內(這個是使用 maxclients 配置指令配置的,請參閱本文檔的下一節獲取更多的信息。

如果它因為當前已經接受了最大數量的客戶端,無法接受當前的客戶端,Redis將嘗試發送一個錯誤給客戶端以便讓其意識到這種情況,并且立即關閉連接。即使連接被Redis立即關閉,錯誤信息也會返回給客戶端,因為新的socket輸出緩沖區一般情況下都足夠放下錯誤信息,因而客戶端內核將處理連接錯誤。

客戶端按照什么順序被處理

該順序是由客戶端socket文件描述符的數字大小及核心報告客戶端事件的順序決定的,因此順序可以看成不確定的。 不過Redis給客戶端提供服務時會做以下兩件事:

  • 每次它從客戶端socket讀取新東西的時候它只執行一次 read() 系統調用,以確保當我們有多臺客戶端連接時,并且有一些要求高客戶端以非常快的速率發送查詢時,其它客戶端不會因此而受到懲罰和經歷一個糟糕的延時。(譯者注:意思就是不讀取完整個socket的消息,而是每個socket輪流讀一次)
  • 當系統調用執行完,當前緩沖中的命令不管有多少都會被順序處理。

最大數量的客戶端

在Redis 2.4中,同時處理的最大客戶端數量的限制是硬編碼的。

在Redis 2.6中這個限制是動態的:默認情況下為10000個客戶端,除非在redis.conf中配置了maxclients配置項。

Redis通過檢查內核中我們可以打開的最多的文件描述符數量,(soft limit被檢查),如果限制小于最大連接客戶端連接數,則加上32(這是Redis儲備給內部使用的文件描述符數量), 接著這個最大連接客戶端的數量將被Redis修改為系統要求的值,以便符合在當前操作系統限制下的真正能夠處理的客戶端數量

當配置的最大客戶端數目不起作用時,則日志將在啟動時顯示,如下面這個例子:

$ ./redis-server --maxclients 100000
[41422] 23 Jan 11:28:33.179 # Unable to set the max number of files limit to 100032 (Invalid argument), setting the max clients configuration to 10112.

當Redis配置處理客戶的具體數量時,確認操作系統中每個進程文件描述符的限制也相應地設置成最大值是個好主意。 在linux下這些限制可以在當前的會話設置,用下面的命令在系統范圍內進行設置:

  • ulimit -Sn 100000 # 這個將只在硬限制足夠大的情況下生效。
  • sysctl -w fs.file-max=100000

輸出緩沖限制

Redis需要為每個客戶端處理可變長度的輸出,因為簡單的命令也可能產生一個需要傳送給客戶端的巨大的數據量。

也可能只是客戶端以較快的速度發送多個的命令產生的更多的輸出,當客戶端處理新消息的速度比服務端發給給它的速度還慢時,特別是Pub/Sub客戶端更是如此。

這兩個原因將導致客戶端輸出緩沖增長及內存消耗增多。因為這個原因在默認情況下Redis為不同類型的客戶端設置了輸出緩沖限制。當限制到達后客戶端的連接將被關閉,同時事件日志記錄在Redis的日志文件中。

Redis使用兩種類型的限制:

  • 硬限制是個固定的限制,當大小達到它Redis會以最快的速度關閉掉客戶端的連接。
  • 軟限制依賴于時間,例如每10秒32兆字節意味著加入客戶端擁有比32兆字節還大的輸出緩沖,持續的在10秒內超過的話連接將被關閉。
  • 不同類型的客戶端有著不同的默認限制:
  • 普通客戶端有著默認為0的限制,這意味著沒有限制,因為大部分的普通客戶端使用阻塞實現發送單個命令,并且在發送下一個命令前等待答復以完全讀取,因此去關閉普通客戶端的連接始終是沒必要的。
  • Pub/Sub客戶端有默認的32兆字節的硬限制及每60秒8兆字節的軟限制。
  • 從機有默認的256兆字節的硬限制及每60秒64兆字節的軟限制。
  • 可以在運行時改變這些限制,使用CONFIG SET命令或者修改redis.conf以永久地改變它。見redis.conf中更多的關于如何設置限制的介紹。

搜索緩沖硬限制

每一個客戶端也受到搜索緩沖限制。這是個不可配置的硬限制,當客戶端搜索緩沖(這是個我們用來積累客戶端的命令的緩沖)達到1GB的時候它將關閉連接,這只是個極限限制,用來避免當客戶端或者服務端軟件出錯導致服務器崩潰的情況。

客戶端超時

最近版本的Reids在默認情況下不會在客戶端空閑很久后關閉連接;連接將永久保留。 不過假如你不喜歡這種行為,你可以設置一個超時時間,這樣當客戶端空閑超過設置的幾秒后,客戶端連接就會被關閉。

你可以在redis.conf中配置這個限制或者簡單的使用CONFIG SET timeout 。 記住這個超時時間只適用于多個客戶端并且它不支持Pub/Sub客戶端, Pub/Sub連接是推送類型的連接,因而客戶端空閑是正常的。

即使在默認情況下連接是不受超時時間限制的,但是有兩種情況設置超時是有意義的:

  • 關鍵任務應用,客戶端軟件可能因為Redis連接飽和而造成出錯,造成服務中斷。
  • 如果一個客戶端出錯使得服務器因為空閑連接而飽和,使得無法與服務器交互,此時可以作為一個檢錯機制去連接服務器。

超時并非非常準確:Redis避免設置計時器或者運行O(N) 算法去輪詢檢測客戶端是否超時, 所以檢查是漸近的一部分一部分完成的。這意味著有可能當超時時間設置為10秒,客戶端的連接將在稍晚的時候被關閉,例如當很多客戶端在同一時間連接的話,可能12秒才被關閉。

客戶端命令

Redis客戶端命令允許檢查所有連接的客戶端的狀態、關掉指定的客戶端的連接、設置連接的名稱。假如你使用一定規模的Redis的話這是個很強大的排錯工具

CLIENT LIST命令用來獲得連接的客戶端列表及它們的狀態:

redis 127.0.0.1:6379> client list
addr=127.0.0.1:52555 fd=5 name= age=855 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
addr=127.0.0.1:52787 fd=6 name= age=6 idle=5 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 

分享到:
標簽:Redis
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定