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

限制某种行为在某个单位时间内最多执行 N 次,怎么做比较好?

  •  
  •   d18 · 2018-08-19 17:36:24 +08:00 · 1606 次点击
    这是一个创建于 1456 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这里行为的主体有两种,一是单个主体,比如一个接口,限制其每单位时间内调用次数。二是有多个独立的主体,比如不同用户,限制用户每单位时间内执行某个操作的次数。
    对于前者,有诸如 token-bucket 之类的算法。
    对于后者,怎么实现比较好呢?

    5 条回复    2018-08-19 19:04:14 +08:00
    gamexg
        1
    gamexg  
       2018-08-19 17:51:36 +08:00
    kv 数据库,
    key: 接口名称_分钟_用户 id
    value: 调用次数
    d18
        2
    d18  
    OP
       2018-08-19 18:02:19 +08:00
    @gamexg 再设置过期时间?
    p2pCoder
        3
    p2pCoder  
       2018-08-19 18:06:49 +08:00 via Android
    用 redis 做限流就可以了
    如果是 spring cloud,用 zuul 写个 filter 可以全局管理
    dubbo 可以设置个限流的 filter,阿里最近开源了一个也可以
    针对特定用户的操作也差不多,多一个 uid 就行
    gamexg
        4
    gamexg  
       2018-08-19 19:01:14 +08:00 via Android
    @d18 key 自带时间,例如频率限制是每分钟 xx 次,那么 key 就带上 unix 时间戳 /60,读取时也带着这个这个。
    scnace
        5
    scnace  
       2018-08-19 19:04:14 +08:00 via Android
    关键字 ratelimit
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4345 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:55 · PVG 13:55 · LAX 22:55 · JFK 01:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.