我正在創建一個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>
。
所以我需要一個非易失性存儲是:
- 讀取的真快,無需耗費太多的資源(什麼是拒接來電,如果過程比自己的電話更昂貴的點)。
- 允許項目上的TTL。
- 性能良好的話,可以增加與模式匹配的所有密鑰(
read_users:*
),而不會超出定義的限制。
和持久存儲:
- 也同樣快速。
- 可以處理大量寄存器。
歡迎任何建議。
恐怕日在這篇文章的範圍之外,我需要自己實現它。 –