avatar
E*8
1
刚在一亩三分地上看到别人的帖子有个题挺有意思,题是设计一个数据结构使得一个
request在1秒之内只能执行50次。
做法是用一个queue来存timestamp,每次来一个request的时候 if 50 > queueSize 直
接加到queue里 else (50 == queueSize) 把queue前面所有大于1秒的timestamp删除,
如果此时queue size小于50了再加进去. 但是这个做法面试官不满意,请问应该怎么做
呢?应该涉及到什么数据结构呢?
哪个大牛给讲讲思路?我能想到的和上面那人也差不多。
avatar
w*u
2
不知道思路对不对
假设bucket 里面有50个token,每秒都会填满bucket,每个reguest需要先拿到token,
service才会执行这个request。
avatar
G*O
3
哈哈,这就是标准的rate limiter

【在 w***u 的大作中提到】
: 不知道思路对不对
: 假设bucket 里面有50个token,每秒都会填满bucket,每个reguest需要先拿到token,
: service才会执行这个request。

avatar
d*n
4
这个token怎么拿到?假设有10个用户要1个token,怎么给?还是说是assign的?

【在 w***u 的大作中提到】
: 不知道思路对不对
: 假设bucket 里面有50个token,每秒都会填满bucket,每个reguest需要先拿到token,
: service才会执行这个request。

avatar
M*l
5
L 359
avatar
b*s
6
我觉得可以稍微修改一下
每个request进来,只需要判断queue里最头的request是不是在一秒之内就可以了
如果是,新的request fail
不是,删掉最老的,添加新的
每个request是 O(1)
当然,最外面是 Map

【在 E*********8 的大作中提到】
: 刚在一亩三分地上看到别人的帖子有个题挺有意思,题是设计一个数据结构使得一个
: request在1秒之内只能执行50次。
: 做法是用一个queue来存timestamp,每次来一个request的时候 if 50 > queueSize 直
: 接加到queue里 else (50 == queueSize) 把queue前面所有大于1秒的timestamp删除,
: 如果此时queue size小于50了再加进去. 但是这个做法面试官不满意,请问应该怎么做
: 呢?应该涉及到什么数据结构呢?
: 哪个大牛给讲讲思路?我能想到的和上面那人也差不多。

avatar
o*r
7
小白抛砖引玉一下。
public class Solution {
private long lastTime = System.currentTimeMillis();
private int limitPerSecond;
private int remains = limitPerSecond;

public Solution(int permitsPerSecond) {
this.limitPerSecond = permitsPerSecond;
}

public boolean acquire() {
long curTime = System.currentTimeMillis();
double timeEplaseInSec = (curTime - lastTime) / 1000.0;
lastTime = curTime;
remains += (int)(timeEplaseInSec * limitPerSecond);
if (remains > limitPerSecond) {
remains = limitPerSecond;
}
if (remains < 1) return false;
else {
remains -= 1;
return true;
}
}

public static void main(String[] args) {
Solution limiter = new Solution(50);
while (true) {
if (limiter.acquire()) {
// Do something
} else {
// wait...
}
}
}
}
avatar
i*h
8
去年有个相同主题你找找
我以为有人挖坟呢

【在 E*********8 的大作中提到】
: 刚在一亩三分地上看到别人的帖子有个题挺有意思,题是设计一个数据结构使得一个
: request在1秒之内只能执行50次。
: 做法是用一个queue来存timestamp,每次来一个request的时候 if 50 > queueSize 直
: 接加到queue里 else (50 == queueSize) 把queue前面所有大于1秒的timestamp删除,
: 如果此时queue size小于50了再加进去. 但是这个做法面试官不满意,请问应该怎么做
: 呢?应该涉及到什么数据结构呢?
: 哪个大牛给讲讲思路?我能想到的和上面那人也差不多。

avatar
E*8
9
搜到了,原来已经有人在这里讨论过了,谢谢啊

【在 i***h 的大作中提到】
: 去年有个相同主题你找找
: 我以为有人挖坟呢

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。