有时候我们想对我们的服务进行某些请求访问限制,即控制流量。还有就是控制用户行为,避免垃圾请求。这个时候我们需要实现一个限流策略,来满足我们的需求。
下面我们实现一个简单的限流策略:系统要限定用户某个行为在指定的时间里只能允许发生N次。
实验环境
1 | python3.7 |
实现方式
使用zset
数据结构,我们使用时间戳来当值,还有就是时间戳当score
来进行值比较,这样我们就能通过时间戳来比较最新的访问记录。
在这个实现方式中,有一个滑动时间窗口(定宽:即指定的时间范围),我们通过score
的差值来圈出这个时间窗口。我们只需要保留这个时间窗口之内的数据,之外的数据都可以删掉。
如下图所示,我们使用一个zset
结构记录用户的行为历史,每一个行为都会作为zset
中的一个key
保存下来。同一个用户的同一种行为用一个zset
记录。
为了节省内存,我们只需要记录保留窗口内的行为记录,不在窗口内的数据,我们直接删除。
通过统计滑动窗口内的行为数量与阈值max_count
之间进行比较就知道当前行为是否被允许。
实现代码
1 | # -*- coding: utf-8 -*- |
我们看到只有5次执行成功,之后的不再成功。这样我们就实现了一个简单的限流策略。
文章为《Redis深度历险 核心原理与应用实践》阅读笔记。