Redis實戰之限制操作頻率

2021-09-24 04:14:27 字數 2531 閱讀 7478

場景1

場景2場景3

在業務開發的過程中,我們不斷的參與各種業務場景的方案設計,往往很容易碰到很類似的場景,只不過當前所屬的業務模組不一樣,其實這些需求的本質是解決同乙個問題,當遇到這種場景的時候,我們需要根據自己經驗分析抽離出需求的本質問題,實現乙個通用的解決方案,讓自己的解決方案更有價值,這可能就是區別於你是有靈魂的工程師還是cp(copy paste)最強王者吧。

分析上面3個業務場景,可以從中發現其中有相似的邏輯,稱它為同類的問題,現在我們就是要抽離這個問題,設計乙個通用的解決方案,勾畫相同邏輯流程圖:

通過分析上面的需求場景,抽離出他們都需要的那些條件:

如果把功能抽離成乙個通用函式是不是大概是這樣:

<?php 

/** * 頻率限制

* @param string $action 操作動作

* @param int $userid 發起操作的使用者id

* @param int $time 時間範圍x秒內

* @param int $number 限制運算元y次

* @return bool

* @throws \exception

*/public static function frequencylimit(string $action, int $userid, int $time, int $number, $expire = )

功能中需要對使用者發起的操作和時間,以及累計次數進行儲存,並且需要失效過期的清理,如果這個時候我們依賴mysql做儲存,想想都覺的挺痛苦,這裡主角:redis 終於登場了,基於redis特性,incr的原子操作和key 支援過期機制,記憶體儲存的效率優勢,可以相對簡單靈活並且又高效的完成目的。

這裡簡單實現個通用功能的**:

<?php 

/** * 頻率限制

* @param string $action 操作動作

* @param int $userid 發起操作的使用者id

* @param int $time 時間範圍x秒內

* @param int $number 限制運算元y次

* @return bool

* @throws \exception

*/public function frequencylimit(string $action, int $userid, int $time, int $number, $expire = )

$key = 'act:limit:' . $action . ':' . $userid;

$r = redisclient::connect();

//獲取當前累計次數

$current = intval($r->get($key));

if ($current >= $number) return false;

//累計並返回最新值

$current = $r->incr($key);

//第一次累加,設定控制操作頻率的有效時間

if ($current === 1) $r->expire($key, $time);

//未超出限制次數先放過

if ($current < $number) return true;

//超出後根據需要重新設定過期失效時間 $current === $number 判斷保證只重新設定一次

$type = empty($expire['type']) ? 0 : intval($expire['type']);

$ttl = empty($expire['ttl']) ? 0 : intval($expire['ttl']);

if ($current === $number && $ttl > 0 && in_array($type, [1, 2]))

return false;

}//場景1

/** * @param int $userid

* @return bool|string

*/public function docomment(int $userid)

catch (\exception $e)

}//場景2

/** * 點讚限制

* @param int $userid

* @return bool|string

*/public function dolike(int $userid)

catch (\exception $e)

}//場景3

/** * 上傳限制

* @param int $userid

* @return bool|string

*/public function doupload(int $userid)

catch (\exception $e)

}//場景n

編碼上可以根據你設計這個通用方案的複雜度進行進一步抽象,如抽象成頻率限制的功能類 等

首發於github?大話web開發,歡迎star ?

Redis應用 限制訪問頻率

如果 收到惡意攻擊,訪問頻率可能在某個時間段特別高可能,影響 效能,嚴重還能能導致往 直接崩潰 的訪問頻率限制可以解決這個問題,1 實現訪問 例如限制每個使用者在一段事件內只能訪問一定數量的次數如 一分鐘只能訪問100次,思路 key可以使用 rete.limiting ip value 使用數值,...

redis實戰 Redis命令之集合

redis的集合以無序的方式儲存多個各不相同的元素,使用者可以快速對集合執行新增元素 移除元素以及檢查元素是否存在於集合中的操作。命令用例 描述注意 sadd sadd key item item 將乙個或多個元素插入到集合中,並返回被新增元素當中原本不存在於集合中的數量 srem srem key...

Redis之字串實戰

字串是redis中最簡單的資料結構,可以儲存文字,也可以儲存數字,還可以儲存二進位制資料。針對型別不同,我們可以把它劃分為3大類,基於普通字串的操作 數字以及二進位制的操作。如下表常見命令 基本操作 數字操作 二進位制操作 set和get incrby 增加 和decrby 減少 setbit 設定...