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 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。
|