1 az422 2018-09-25 09:46:03 +08:00 via Android 每次自增后设置该 key 十五分钟后过期,直到 100 |
![]() | 2 Immortal 2018-09-25 09:51:21 +08:00 via Android 想了下 这个需求其实用关系型数据库会简单一些 弄一个表来记录申请和实际使用 大概字段:账号 id 申请时间 是否使用 使用时间。 |
![]() | 3 Mohanson 2018-09-25 09:58:58 +08:00 via Android 描述一大堆,不就是限流吗,搜令牌桶算法 |
![]() | 4 rbe 2018-09-25 10:36:10 +08:00 简单说就是,15 分钟最多请求 100 次接口是吧。那就是一个接口限流问题,同楼上说的,令牌桶算法,可以搜一下各个语言的 RateLimiter 实现 |
![]() | 5 takeoffyoung 2018-09-25 10:43:59 +08:00 既然你能拿到他“未使用过”这个信息,相信同理可以拿到他“使用过”,那就仅在“使用过”事件的回调中给响应的 key incr。“那我给他一个位置” 记一条日志就好 |
![]() | 6 momocraft nbsp;2018-09-25 11:17:38 +08:00 为什么你们都看得懂这个中文 :scream: |
7 honeycomb 2018-09-25 11:48:02 +08:00 via Android 令牌筒算法? |
8 joyme 2018-09-25 12:04:20 +08:00 限流的方案令牌桶算法确实是一个好的选择。但是你这个问题明显更简单一些,其实没有必要 15 分钟后实时的自动还原。换一种思路: 1. 每次使用时记录当前剩余的次数和使用的时间 2.每次查询时判断上次的使用时间,如果时间差超过 15 分钟,就当成 100 次去计算,否则使用计数器。这样就免去了实时更新使用次数的问题。 3.redis 这样使用会有一个 check and set 的问题,必须保证原子性操作,可以使用 lua 脚本去解决。 这里是一个令牌桶的实现,基本思路都是一样的。 https://www.myway5.com/index.php/2018/04/16/%E6%8E%A5%E5%8F%A3%E8%AF%B7%E6%B1%82%E9%80%9F%E7%8E%87%EF%BC%88%E6%8E%A5%E5%8F%A3%E9%98%B2%E5%88%B7%EF%BC%89%E9%99%90%E5%88%B6%E6%96%B9%E6%A1%88/ |
![]() | 9 keakon 2018-09-25 12:32:43 +08:00 https://redis.io/commands/incr 看官方文档的 Rate limiter |
![]() | 10 mmdsun 2018-09-25 19:06:50 +08:00 via Android 一句话:Key 设过期时间。没有 key 重新创。自增 key。 |