redis限流-控制用户访问频率

一,前言

开发接口服务的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务上的各种接口进行调用次数的限制。比如对于某个 用户,他在一个时间段(interval)内,比如 1 分钟,调用服务器接口的次数不能够 大于一个上限(limit),比如说 100 次。如果用户调用接口的次数超过上限的话,就直接拒绝用户的请求,返回错误信息。

二,令牌桶算法原理

随着时间流逝,系统会按恒定1/QPS时间间隔(如果QPS=100,则间隔是10ms)往桶里加入令牌,如果桶已经满了就不再加了.新请求来临时,会各自拿走一个令牌,如果没有令牌可拿了就阻塞或者拒绝服务.

三,基于redis实现的令牌桶算法

public function limit($uid = 0){

    $redis = new \Redis();
    $redis->connect('127.0.0.1', 6379);

    //单个用户每分钟访问数
    $initNum = 100;
    $expire = 60;

    $key = $uid . '_minNum';
    $redis->watch($key);
    $limitVal = $redis->get($key);
    if ($limitVal) {
        $limitVal = json_decode($limitVal, true);
        $nowtime = time();
        //计算当前时刻与上次访问的时间差乘以速率就是此次可以补充的令牌个数
        $newNum = min($initNum, ($limitVal['n
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值