乙個簡單基於LRU連線檢測實現

2021-09-08 16:40:32 字數 2320 閱讀 3792

在做網路應用的時候經常要處理不處於活動的連線,對於不活動的tcp連線可以通過設定keepalive來觸發socketerror來處理掉.但有更多的時候是使用ping和pong來處理.對於ping,pong這種做法的發起者有兩種情況,分別是由server或client發起.對於由伺服器發起比較損耗資源畢竟每隔一段時間都要向整個連線列傳送ping,當累計到定數量沒得到pong回應用的時候殺死;而對於client發起的話server只需要記錄ping時間即可,隔一段時間沒有得到ping的client殺死.但兩種做法似乎都要對連線列表進行一次掃瞄,存在大量活動連線的時候這種做法似乎並不理想.

其實可以通過乙個lru演算法簡單地把活動連線前置,那在處理的時候只需要關心不活動的連線即可以,lru演算法大概如下:

lru(least recently used)。

假設 序列為 4 3 4 2 3 1 4 2

物理塊有3個 則

首輪 4調入記憶體 4

次輪 3調入記憶體 3 4

之後 4調入記憶體 4 3

之後 2調入記憶體 2 4 3

之後 3調入記憶體 3 2 4

之後 1調入記憶體 1 3 2(因為最近最久未使用的是4,所以丟棄4)

之後 4調入記憶體 4 1 3(原理同上)

最後 2調入記憶體 2 4 1

可以通過乙個簡單的鏈結來完成上面功能,當某個專案接收到ping的時候,移到煉表頭即可以.在掃鍊錶的時候只需要由尾部掃起,值到某個值不存在超時的時候就可以停止掃瞄.

通過lru就能做到在活躍連線比較多的情況有比較好的處理效果,由於鍊錶在找值的時候必須要掃一次,所以當連線更新在鍊錶中尋找相應的值成本是不太划算的.可以通過制訂乙個雙向引用的結構來解決尋找問題.

///

///連線描述介面

/// public

inte***ce

iconnecton

//////

超時操作,當lru演算法檢測到應該連線超時的時候會呼叫該方法

/// void

timeout();

}//////

節點資訊

/// public

class

node

}

制定乙個應用介面和相應的節點型別.通過這個介面規範就可以方便定位到鍊錶的節點上.

public

void

update(iconnecton connection)

else}}

當乙個項更新的時候就不再需要遍歷鍊錶查詢,這樣就能節省大量查詢上的損耗.當然乙個完整的lru檢測機制不是要乙個timer來驅動,完全**如下:

///

///基於lru演算法的連線檢測

/// public

class

lrudetect : idisposable

private

intmtimeout;

private

system.threading.timer mtimer;

private linkedlistmlinkedlist = new linkedlist();

//////

更新連線

/// ///

連線資訊

public

void

update(iconnecton connection)

else}}

//////

刪除連線

/// ///

連線資訊

public

void

delete(iconnecton connection)}}

private

void ondetect(object

state)}}

//////

連線描述介面

/// public

inte***ce

iconnecton

//////

超時操作,當lru演算法檢測到應該連線超時的時候會呼叫該方法

/// void

timeout();

}//////

節點資訊

/// public

class

node

}//////

釋放物件

/// public

void

dispose()}}

Python實現乙個簡單的目標檢測

輸入測試 用選擇性搜尋 select search 方法,對輸入選出n個候選區域 用訓練好的cnn模型 每個候選區域,保留乙個得分最高的候選區域 輸出 結果 import sys import cv2 import numpy as np import tensorflow as tf from t...

Python 基於Redis實現乙個簡單的分布式鎖

redis lock.py import redis import time import threading 連線池方式 pool redis.connectionpool host 127.0.0.1 port 6379 redis con redis.redis connection pool...

基於Socket程式設計實現乙個簡單的Web伺服器

1.using system using system.collections.generic using system.linq using system.net using system.net.sockets using system.text using system.threading.t...