令牌桶算法:不断将令牌丢进桶里,一个请求能不能得到处理,就看这个请求能不能得到桶里的令牌(也就是说得不到令牌的请求就不能被处理)
r表示令牌存放到桶里的速度(令牌存放到桶里有两种方法:每秒存放5个,或者每搁4秒存放20个),令牌放到桶里面的速度是匀速的
W表示当前桶内有多少个令牌
C表示桶的容量
b表示当前的请求
at表示处理完上一个请求的时间点
bt表示当前请求过来的时间点
那现在要做的就是判断当请求b过来的时候,桶里面是否有令牌?
bt=now(); //当前请求过来的时间
Wb=(bt-at)*r //上一个请求处理完到当前请求过来的这段时间内桶内新增的令牌数
W=min(W+Wb,C)//桶内的实际令牌数量
if(W>=1)
{
W--;
return true;
}
else//令牌桶里没有令牌
{
return false;
}
漏桶算法:请求能否被执行,是看这个请求能否被放到桶里面
没有令牌的概念了,把请求放到桶里面
b表示当前要处理的请求
at表示处理完上一个请求的时间点
C表示木桶的总容量
W 当前桶内剩余可以容纳的请求数
r处理请求的速度
bt=now(); //当前请求过来的时间
Wb=(bt-at)*r //上一个请求处理完到当前请求过来的这段时间内处理掉的请求数
W=MAX(W-Wb,0)//桶内剩余的请求数
if(W<C)//剩余的请求数小于桶的容量
{
W++;
return true;
}
else//桶已经满了
{
return false;
}