乙個快取實現平均分配佇列的方案

2021-09-07 16:03:36 字數 784 閱讀 4105

在工單系統中,角色有處理員和報告人,乙個工單建立後會被分配給多個待選處理員中的乙個。

現要求平均的分配給這些處理員,使得每個處理員的工作量大體相當。

為了實現平均分配,首先想到的是隨機數。

從資料庫中獲取到處理員組後,根據組的大小生成隨機數作為下標,返回該下標對應的處理員即可。

實現簡單,但如果一天的單數不多,那這一天每個處理員分到手頭上的工單數就可能差別很大。

在快取中維護乙個處理員佇列,再維護乙個自增的下標值。

每次要分配處理員時,則從快取中獲取下標值,獲取時返回的是自增後的,即++i。

當該下標值超過處理員佇列的 size 時,則將該下標值置為 0,即返回隊首的處理員。這種方式類似於負載均衡中的輪詢法。

快取通過 redis 實現,自增下標值通過 incr 命令實現,處理員佇列通過 list 結構儲存。

下標值也可以不用置 0,始終遞增,而下標則為下標值對處理員佇列 size 取餘。

現處理員可以選擇停止接單或開始接單。

那當處理員選擇停止接單後快取中的處理員佇列就要將該處理員刪掉,同樣當處理員選擇開始接單後要將處理員加到處理員佇列的隊尾。

這時,如果下標取得方式為取餘,則會存在一種極端情況:

每次分配處理員時都有乙個新的處理員被加到佇列中,比如當前佇列中為 a b c,下標值為 4,則分配給下標為 1 的 b 處理員,分配後處理員 d 開始接單,當前佇列變為 a b c d,則下一次分配時,下標值為 5,那對 size = 4 取餘,結果還是 1,那麼還是會分給下標為 1 的 b 處理員。

這種情況下,下標置 0 的方式會更好。

記錄乙個shell指令碼的題目 8公升水平均分

有乙個 8 公升的瓶子裝滿水,還有乙個 5 公升的空瓶子和乙個 3 公升的空瓶子。要求將水分成兩個 4 公升。執行指令碼之後要生產類似這樣的解決方案 your containers 8 5 3 solution1 step0 8 0 0 solution1 step1 3 5 0 solution1...

Java實現乙個簡單的快取

快取是在web開發中經常用到的,將程式經常使用到或呼叫到的物件存在記憶體中,或者是耗時較長但又不具有實時性的查詢資料放入記憶體中,在一定程度上可以提高效能和效率。下面我實現了乙個簡單的快取,步驟如下。public class entitycache public object getdatas pu...

迴圈佇列的乙個簡單實現

這是筆試中遇到的一道題,要求實現迴圈佇列,有入隊,出隊,判斷是否為空,是否滿等操作。分析 可以使用乙個陣列來存放迴圈佇列,隊頭標記與隊尾標記初始都為0,入隊操作即隊尾標記加1,若加1後相對迴圈等於隊頭則上溢 出隊操作即隊頭標記加1,若加1後相對迴圈等於隊尾則下溢 若隊頭標記等於隊尾標記則為空 若隊尾...