滑動視窗實現訪問頻率限制

2021-10-05 05:02:44 字數 2871 閱讀 5564

主要思路有兩個

以時間戳為有序集合的成員

每次請求,先使用zremrangebylex命令移除視窗外的成員

使用zrange命令獲取有序集合的成員和相應權重

使用zincrby命令對相應的成員的權重加一

使用expire命令重新設定有序集合有效期

對獲取到的有序集合的成員的權重求和,並判斷是否超過閾值

php實現

$maximum=10

;// 最大請求數量

$slidingwindow=10

;// 滑動視窗大小(s)

$now

=time()

;$rediskeymod

='pre:sliding_window:sorted_sets:%s'

;$rediskey

=sprintf

($rediskeymod

,'test.com');

// 全站視窗

//$rediskey = sprintf($rediskeymod, '/api/test/info');// 某個介面視窗

//$rediskey = sprintf($rediskeymod, '');// 某個access-token視窗

$redis

=new

redis()

;$redis

->

connect

('192.168.10.5'

,6379);

$redis

->

auth

('rc_redis');

$redis

->

multi()

;$redis

->

zremrangebylex

($rediskey

,'[0'

,'['.(

$now

-$slidingwindow))

;// 移除視窗外的資料

$redis

->

zrange

($rediskey,0

,-1,

true);

// 獲取視窗權重資料

$redis

->

zincrby

($rediskey,1

,$now);

// 增加權重

$redis

->

expire

($rediskey

,$slidingwindow);

$res

=$redis

->

exec()

;if(array_sum

($res[1

])>

$maximum

)

以時間戳為有序集合的成員

每次請求,先使用zrevrangebyscore命令移除視窗外的成員

使用zrange命令獲取有序集合的成員

使用zadd命令給有序集合增加成員

使用expire命令重新設定有序集合有效期

計算獲取到的成員數量,並判斷是否超過閾值

php實現

$maximum=10

;// 最大請求數量

$slidingwindow=10

;// 滑動視窗大小(s)

$now

=microtime

(true);

$rediskeymod

='pre:sliding_window:sorted_sets:%s'

;$rediskey

=sprintf

($rediskeymod

,'test.com');

// 全站視窗

//$rediskey = sprintf($rediskeymod, '/api/test/info');// 某個介面視窗

//$rediskey = sprintf($rediskeymod, '');// 某個access-token視窗

$redis

=new

redis()

;$redis

->

connect

('192.168.10.5'

,6379);

$redis

->

auth

('rc_redis');

$redis

->

multi()

;$redis

->

zremrangebyscore

($rediskey,0

,$now

-$slidingwindow);

// 移除視窗外的資料

$redis

->

zrange

($rediskey,0

,-1)

;// 獲取視窗資料

$redis

->

zadd

($rediskey

,$now

,$now);

$redis

->

expire

($rediskey

,$slidingwindow);

$res

=$redis

->

exec()

;if(count

($res[1

])>

$maximum

)

PHP PHP redis滑動視窗頻率限制

使用redis進行頻率限制 並且使用滑動視窗形式 可以防止臨界點時的超頻 在下面 請自行替換new redis 物件 function check queuename,count,timewindow 佇列滿了,取出最早訪問的時間 earlytime redis lindex queuename,l...

PHP PHP redis滑動視窗頻率限制

使用redis進行頻率限制 並且使用滑動視窗形式 可以防止臨界點時的超頻 在下面 請自行替換new redis 物件 function check queuename,count,timewindow 佇列滿了,取出最早訪問的時間 earlytime redis lindex queuename,l...

duilib 滑動顯示的視窗實現

經jhgwqp csdn提醒,將這事做了.編譯環境 vs2010 vc duilib 效果圖 預覽 建立彈出的滑動對話方塊時,要以子視窗風格建立,這樣,主視窗移動時,我們就不用負責子視窗的位置移動了.cpp view plain copy void cmaindlg createdlgsliding...