2017-04-24 63 views
0

我正在創建一個API限制器,並且我正在決定使用什麼系統來存儲數據。基於用例的數據庫技術選擇

很明顯,我將需要一個易失性存儲器和一個持久存儲器。

在揮發性我要存儲這樣的鍵值:

read:14522145 100 
read:99885669 16 
read:78951585 100 

這是一個組成鍵:{action}:{client}和一個整數值(可用信用)。

在持久性上,我想保留所有資源中斷的記錄。

該算法(僞代碼)是很簡單:

MAX_AMOUNT = 100 
call(action, client, cost) { 
    key = action + ":" + client 
    if (volatileStorage.hasKey(key)) { 
    value = volatileStorage.getValue(key) 
    if (value >= cost) { 
     volatileStorage.setValue(key, value - cost) 
     return true 
    } else { 
     persistentStorage.logOutage(method, client, cost) 
     return false 
    } 
    } else {   
     volatileStorage.setValue(key, MAX_AMOUNT) 
     return call(action, client, cost) 
    } 
} 

有運行每N秒每個method並行處理,其增加的所有密鑰{action}:*由M,至多O.

此外,我想從易失性存儲中刪除比P秒更舊的所有項(從未修改)。

所以基本上每個動作都是action<N, M, O, P>。例如,閱讀用戶每1秒增加5點,達到100,並在60秒不活動後移除:read_users<1, 5, 100, 60>

所以我需要一個非易失性存儲是:

  1. 讀取的真快,無需耗費太多的資源(什麼是拒接來電,如果過程比自己的電話更昂貴的點)。
  2. 允許項目上的TTL。
  3. 性能良好的話,可以增加與模式匹配的所有密鑰(read_users:*),而不會超出定義的限制。

和持久存儲:

  1. 也同樣快速。
  2. 可以處理大量寄存器。

歡迎任何建議。

回答

1

這不是一個答案,而是一個觀點:有現有的限速器,你會更好地使用,而不是自己做。正確地做到這一點非常棘手,因此採用經過生產驗證的實施方式不僅更簡單,而且更安全。

例如,Generic cell rate algorithm無異的純魔術和具有若干Redis的實現方式,包括:

當然,還有更多的Redis基於速率限制器 - 我使用谷歌找到他們;)

+0

恐怕日在這篇文章的範圍之外,我需要自己實現它。 –