令牌桶算法限流

令牌桶算法限流

其他限流方式

之前去面试的时候,面试官出了一题,要求对每个用户的请求进行限流,假设限制用户每分钟请求100次,我的方案是这样的:

  • 用户访问的时候我们 ttl limit如果该字段存活则认为60秒内访问过,直接读取limit的数值;如果ttl未存活则认为是首次访问.

  • 通过ttl的返回数据,判断用户是否处应该被限制访问.

    • 如果ttl的结果小于0, 我们 setEx limit 60 100,继续执向下执行.
    • 如果ttl的结果大于0,我们 incr limit,同时判断incr的返回值如果大于100,则停止执行且提示请等待ttl秒.
  • 如果对限流有更精细话的要求可以对每10秒也做一下限制,然后使用setNx配合更加精细的逻辑判断,避免并发.

不过我的方案被否认了,面试官推荐了令牌桶算法.当时没想到,回去一想,令牌桶算法并不适用于对单个用户的限流.

令牌桶算法更加适合对,整个服务器的限流.

令牌桶算法

简而言之就是,每隔一段时间向桶内(这个桶可以是一个队列,也可以是一个数字,如果是一个数字就需要自己控制并发),放置一定数量的令牌.

每个访问的用户从桶内拿出一个令牌,如果令牌消耗完毕则禁止访问.直到新的令牌被放入桶内后用户才可以再次获取令牌进行访问.

实现方式有很多种,有使用Redis队列或string(注意处理并发),如果是常驻内存的进程的也可以使用数组队列.

如果使用一个数字,要要注意并发问题可以使用Redis的getSet,setNx,expire或者配合一个其他字段做更新时间即可.

转载于:https://my.oschina.net/chinaliuhan/blog/3085816

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值