V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
snnn
V2EX  ›  问与答

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

  •  1
     
  •   snnn · 2014-07-25 11:32:42 +08:00 · 6193 次点击
    这是一个创建于 3567 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如,我做了一个注册用户的接口。
    我想限制:
    1.每个IP每3秒只能注册一个账号
    2.每个IP每分钟只能注册10个账号
    2.每个IP每小时只能注册300个账号

    该如何实现?

    谢谢!
    7 条回复    2014-07-25 13:21:11 +08:00
    eslizn
        1
    eslizn  
       2014-07-25 11:33:48 +08:00
    带创建时间戳计数器呗
    tabris17
        2
    tabris17  
       2014-07-25 11:38:57 +08:00
    服务器内存中维护一套IP调用时间戳的映射表呗
    snnn
        3
    snnn  
    OP
       2014-07-25 11:43:52 +08:00
    @tabris17 怎么做到线程安全和过期自动清除老数据呢?
    数据是按秒存,还是按照秒、分钟、小时各存一份?
    jevonszmx
        4
    jevonszmx  
       2014-07-25 11:45:39 +08:00
    @snnn
    可以使用redis,本身redis是单线程操作,所以线程安全可以保证
    yibin001
        5
    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
        6
    sonicwu  
       2014-07-25 12:08:19 +08:00   ❤️ 2
    不用数据结构和定时器的流量限制算法 -- "Token Bucket"

    http://stackoverflow.com/a/668327
    r4ntix
        7
    r4ntix  
       2014-07-25 13:21:11 +08:00 via Android
    @sonicwu Token Bucket 也是需要记录时间戳的,而且要对时间切片来应对brust 情况。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2637 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:40 · PVG 21:40 · LAX 06:40 · JFK 09:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.