本文主要总结自《redis深度历险》
限流的意义
限流一般是指在一个时间窗口内对某些操作请求的数量进行限制,比如一个论坛限制用户每秒钟只能发一个帖子,每秒钟只能回复5个帖子。限流可以保证系统的稳定,限制恶意请求,防止因为流量暴增导致系统瘫痪宕机。常用的限流算法有:滑动窗口、漏斗以及令牌桶。
滑动窗口算法rolling Window
以限制用户行为为例子,比如一秒内进行某个操作50次,这种行为应该进行限制。
滑动窗口就是记录一个滑动的时间窗口内的操作次数,操作次数超过阈值则进行限流。
网上找的图:
在redis中可以用zset数据结构来实现这个功能:
用唯一的id作为zset的key,可以是user_id + action_key ,value是当前操作的时间戳。每次新的操作请求进来时,先判断当前时间窗口内记录的操作次数 count,小于阈值max则允许进行操作,超过阈值则进行限流。同时对时间窗口之外的数据进行清理,节省内存。
简单代码实现:
public boolean isActionAllowed(String userId, String actionKey, int