API 调用频次限制怎么实现?

2014-07-25 11:32:42 +08:00
 snnn
比如,我做了一个注册用户的接口。
我想限制:
1.每个IP每3秒只能注册一个账号
2.每个IP每分钟只能注册10个账号
2.每个IP每小时只能注册300个账号

该如何实现?

谢谢!
6209 次点击
所在节点    问与答
7 条回复
eslizn
2014-07-25 11:33:48 +08:00
带创建时间戳计数器呗
tabris17
2014-07-25 11:38:57 +08:00
服务器内存中维护一套IP调用时间戳的映射表呗
snnn
2014-07-25 11:43:52 +08:00
@tabris17 怎么做到线程安全和过期自动清除老数据呢?
数据是按秒存,还是按照秒、分钟、小时各存一份?
jevonszmx
2014-07-25 11:45:39 +08:00
@snnn
可以使用redis,本身redis是单线程操作,所以线程安全可以保证
yibin001
2014-07-25 11:46:37 +08:00
三个key
key:ip:sec 3秒自动过期,每次注册时检查key存不存在,不存在就写入,然后走注册流程。
key:ip:min 1分钟自动过期,每次注册前判断值,注册成功以后+1
key:ip:hour 1小时自动过期,判断同上
sonicwu
2014-07-25 12:08:19 +08:00
不用数据结构和定时器的流量限制算法 -- "Token Bucket"

http://stackoverflow.com/a/668327
r4ntix
2014-07-25 13:21:11 +08:00
@sonicwu Token Bucket 也是需要记录时间戳的,而且要对时间切片来应对brust 情况。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/124433

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX