IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> redis限流-控制用户访问频率 -> 正文阅读

[大数据]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['num'] - 1) + (($initNum / $expire) * ($nowtime - $limitVal['time'])));
        if ($newNum > 0) {
            $redisVal = json_encode(['num' => $newNum, 'time' => time()]);
        } else {
            exit(json_encode(['status' => false, 'msg' => '当前时刻令牌消耗完!']));
        }
    } else {
        //第一次访问时初始化令牌个数
        $redisVal = json_encode(['num' => $initNum, 'time' => time()]);
    }

    $redis->multi();
    $redis->set($key, $redisVal);
    $result = $redis->exec();

    if (!$result) {
        exit(json_encode(['status' => false, 'msg' => '访问频次过多!']));
    }

    //其他操作}

redis的watch:?

  1. watch 用于在进行事务操作的最后一步也就是在执行exec 之前对某个key进行监视

  2. 如果这个被监视的key被改动,那么事务就被取消,否则事务正常执行.

  3. 一般在MULTI 命令前就用watch命令对某个key进行监控.如果想让key取消被监控,可以用unwatch命令

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-12-11 15:47:32  更:2021-12-11 15:49:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:12:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码