首頁  >  文章  >  後端開發  >  redis計數器防止刷單方法介紹

redis計數器防止刷單方法介紹

小云云
小云云原創
2017-12-14 14:29:172623瀏覽

如果我們要在介面請求上,做一下並發限制的處理,或是做一個防止刷單的安全攔截,例如一個介面請求,限制每秒請求總數為200次,超過200次就等待,等下一秒,再次請求,這裡用到一個redis作為一個計數器的模式來實現。本文主要向大家介紹了redis實作計數器防止刷單的方法和相關程式碼,具有一定參考價值,需要的朋友可以了解下。

呼叫redis的方法:

INCR key

將 key 中儲存的數字值增一。

如果 key 不存在,那麼 key 的值會先初始化為 0 ,然後再執行 INCR 運算。

如果值包含錯誤的類型,或字串類型的值不能表示為數字,那麼回傳一個錯誤。

這是一個針對字串的操作,因為 Redis 沒有專用的整數類型,所以 key 內儲存的字串被解釋為十進位 64 位元有符號整數來執行 INCR 操作。

code:

redis> SET test 20
OK
redis> INCR test
(integer) 21
redis> GET test # 数字值在 Redis 中以字符串的形式保存
"21"

#計數器的實作

計數器是Redis 的原子自增操作可實現的最直觀的模式了,它的想法相當簡單:每當某個操作發生時,向Redis 發送INCR 命令。

例如在一個web 應用程式中,如果想知道使用者在一年中每天的點擊量,那麼只要將使用者ID 以及相關的日期資訊作為鍵,並在每次使用者點擊頁面時,執行一次自增操作即可。

例如使用者名稱是 peter ,點擊時間是 2012 年 3 月 22 日,那麼執行指令 INCR peter::2012.3.22 。

$redisKey = “api_name_” + $api;
$count = $this->redis->incr($redisKey);
if ($count == 1) {
//设置有效期一s
$this->redis->expire($redisKey,1);//设置一s的过期时间
}
if (count > 200) {//防止刷单的安全拦截
return false;//超过就返回false
}
//后续处理

這就簡單的實作了redis計數器的應用,另外還有以下方法:

以下幾種方式擴展這個簡單的模式:

可以透過組合使用INCR 和EXPIRE ,來達到只在規定的生存時間內進行計數(counting)的目的。
客戶端可以透過使用 GETSET 指令原子性地取得計數器的目前值並將計數器清零,更多資訊請參考 GETSET 指令。
使用其他自增/自減操作,例如 DECR 和 INCRBY ,使用者可以透過執行不同的操作來增加或減少計數器的值,例如在遊戲中的記分器就可能用到這些命令。

相關建議:

php中Redis函數的用法總結

Redis叢集建立全記錄

效能計數器的10篇內容推薦

以上是redis計數器防止刷單方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn