iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >redis lua限流算法如何实现
  • 452
分享到

redis lua限流算法如何实现

2023-07-02 18:07:11 452人浏览 八月长安
摘要

本篇内容介绍了“redis lua限流算法如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!限流算法常见的限流算法计数器算法漏

本篇内容介绍了“redis lua限流算法如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    限流算法

    常见的限流算法

    • 计数器算法

    • 漏桶算法

    • 令牌桶算法

    计数器算法

      顾名思义,计数器算法是指在一定的时间窗口内允许的固定数量的请求.比如,2s内允许10个请求,30s内允许100个请求等等.如果设置的时间粒度越细,那么相对而言限流就会越平滑,控制的粒度就会更细.

    场景分析

    试想,如果设置的粒度比较粗会出现什么样的问题呢?如下图设置一个 1000/3s 的限流计数统计.

    redis lua限流算法如何实现

    图中的限流策略为3s内允许的最大请求量为1000,那么会出现2个极端:
     

    极端情况1:

    • 第1s请流量为10,  

    • 第2s请流量为10,  

    • 第3s请流量突然激增到980.这意味着在这一刻,有大量的请求蜂拥而至,假设服务每秒能处理的

    上线为800/1s,但是此刻却有超过这个量级的请求量,那么后果是不堪设想的.

    极端情况2:  

    • 第1s请流量突然就达到990,

    • 留给后续第2s,3s的可请求数量就非常少了,可能会出现大量的拒绝请求.

    结论:

    如果用统计计数算法,尽量保持粒度切割精细.

    算法实现

    Redis的ttl特性完美的满足了这一需求,将时间窗口设置为key的失效时间,然后将key的值每次请求+1即可.伪代码实现思路:

    //1.判断是否存在该keyif(EXIT(key)){  // 1.1自增后判断是否大于最大值,并返回结果  if(INCR(key) > maxPermit){     return false;  } return true;}//2.不存在key,则设置key初始值为1,失效时间为3秒SET(KEY,1);EXPIRE(KEY,3);

    漏铜算法

    漏桶算法核心概念:

    • 桶的容量是固定的,并且水流以一个固定的速率流出;

    • 流入的水流可以是任意速率;

    • 如果流入的水流超出了桶的容量,则后续流入的水流溢出(请求被丢弃)。

    • 如果桶内没有水,则不需要流出

    redis lua限流算法如何实现

    缺点:

    不难想象漏桶算法并不能很好的应对突发的流量限制,在某一个时间段流量激增,则漏桶算法处理就比较无能为力.这个时候就需要用到和他相反设计的令牌桶算法

    令牌桶算法:

    redis lua限流算法如何实现

    如上图所示,整个请求流程一目了然.简单概括如下:

    用户请求资源时首选从桶里获取令牌,如果有令牌则放行,如此同时桶里的令牌数量-1

    于此同时,以一定的速率往桶里加入令牌,这个速度是可根据实际场景随意设置.

    算法实现

    var key;var maxPermit;//桶的容量,即最大请求限制var expire;//失效时间var bucketInterval;//每次向桶里添加令牌的时间间隔var bucketNum;//每次向桶里添加令牌的个数var lastTimeKey = key +"last";//标记上一次操作时间//判断是否存在该keyif(EXIT(key)){  var value = GET(key);  var diffTime = now() - lastTimeKey;  // 1.1判断是否超出时间间隔  if(diffTime  > bucketInterval){      // 1.2根据时间间隔,计算出应该向桶里添加令牌的个数      local maxValue = value+math.floor(diff/interval)*step;      if (maxValue > limit)         value = limit;      else         value = maxValue;     //设置key的值及操作时间     SET(key,value);     SET(lastTimeKey,now());       }  // 2.1在时间间隔内,判断桶里是否有值  if(value <= 0){     reurn false;  }else{    // 2.2 减1    DECR(key);  }reture true;}//2.不存在key,则设置key初始值为maxPermit-1SET(key,maxPermit-1);EXPIRE(lastTimeKey,now());

    上面实现代码只是伪代码,提供的是一种思路而已. 仔细想来其中某个环节其实并不完美.大家可以参考Guava的ratelimit实现思路,他的限流就是基于令牌桶算法,但是比较遗憾的是在单机下的限流.

    思考:&ensp;&ensp;

    就是时间间隔如果过长的话,一次性向桶里添加的令牌数量则是桶的最大容量!那么某个时间的瞬间请求过来,服务器的压力是非常大的.

    所以此处增加令牌数可以设置的稍微合理些,哪怕间隔时间再长!

    “redis lua限流算法如何实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: redis lua限流算法如何实现

    本文链接: https://www.lsjlt.com/news/343650.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • redis lua限流算法如何实现
      本篇内容介绍了“redis lua限流算法如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!限流算法常见的限流算法计数器算法漏...
      99+
      2023-07-02
    • redis lua限流算法实现示例
      目录限流算法计数器算法场景分析算法实现漏铜算法令牌桶算法:算法实现限流算法 常见的限流算法 计数器算法漏桶算法令牌桶算法 计数器算法   顾名思义,计数器算法是指在一定的时间窗口内允许的固定数量的请求...
      99+
      2022-07-15
      redis lua限流算法 redis lua算法
    • redis lua限流算法实现示例
      目录限流算法计数器算法场景分析算法实现漏铜算法令牌桶算法:算法实现限流算法 常见的限流算法 计数器算法漏桶算法令牌桶算法 计数器算法   顾名思义,计数器算法是指...
      99+
      2022-11-13
    • 使用AOP+redis+lua做方法限流的实现
      目录需求实现方式源码Limit 注解LimitKeyLimitTypeRedisLimiterHelperLimitInterceptorTestService需求 公司里使用One...
      99+
      2022-11-13
    • Redis Lua脚本实现ip限流示例
      目录引言相比Redis事务来说,Lua脚本有以下优点Lua脚本Java代码IP限流Lua脚本引言 分布式限流最关键的是要将限流服务做成原子化,而解决方案可以使使用redis+lua或者nginx+lua技术进行实现,通过...
      99+
      2022-07-15
      Redis Lua ip限流 Redis Lua
    • Redis和Lua实现分布式限流器
      本篇文章为大家展示了Redis和Lua实现分布式限流器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。原理计数器算法是指在一段窗口时间内允许通过的固定数量的请求, 比...
      99+
      2022-10-18
    • Redis Lua脚本实现ip限流示例
      目录引言相比Redis事务来说,Lua脚本有以下优点Lua脚本java代码IP限流Lua脚本引言 分布式限流最关键的是要将限流服务做成原子化,而解决方案可以使使用redis+lua或...
      99+
      2022-11-13
    • SpringBoot+Redis+Lua分布式限流的实现
      Redis支持LUA脚本的主要优势 LUA脚本的融合将使Redis数据库产生更多的使用场景,迸发更多新的优势: 高效性:减少网络开销及时延,多次redis服务器网络请求的操作,使用L...
      99+
      2022-11-13
      SpringBoot Redis Lua分布式限流 SpringBoot 分布式限流
    • 怎么用Redis Lua脚本实现ip限流
      这篇文章主要讲解了“怎么用Redis Lua脚本实现ip限流”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Redis Lua脚本实现ip限流”吧!引言分布式限流最关...
      99+
      2023-07-02
    • Redis常见限流算法原理及实现
      目录前言简介固定时间窗口原理示例说明优缺点相关实现限流脚本具体实现测试滑动时间窗口实现原理示例说明具体实现漏桶算法原理具体实现令牌桶算法原理具体实现小结总结前言 在高并发系统中,我们通常需要通过各种手段来提供系统的可以用...
      99+
      2022-08-08
      Redis限流算法原理实现 Redis限流算法
    • 如何实现redis限流
      如何实现redis限流?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。redis限流的实现方式有3种,分别是:第一种:基于Redis的set...
      99+
      2022-10-18
    • redis如何实现限流
      redis实现限流的示例:使用接口实现,接口代码如下:#指定用户user_id的某个行为action_key在特定的时间内period只允许发生最多的次数max_countdef is_action_al lowed(u...
      99+
      2022-10-08
    • 如何使用Redis和Lua开发限流器功能
      如何使用Redis和Lua开发限流器功能引言:随着互联网的发展,许多应用都面临着高并发的挑战。在面对大量请求时,必须采取措施来保护系统的稳定性和可用性,其中一个重要的手段就是限流。限流是指对请求的流量进行控制,确保系统在负载高峰时仍然能够正...
      99+
      2023-10-22
      redis lua 限流器
    • 怎么使用Go+Redis实现常见限流算法
      本文小编为大家详细介绍“怎么使用Go+Redis实现常见限流算法”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Go+Redis实现常见限流算法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。固定窗口使用R...
      99+
      2023-07-05
    • Go+Redis实现常见限流算法的示例代码
      目录固定窗口滑动窗口hash实现list实现漏桶算法令牌桶滑动日志总结限流是项目中经常需要使用到的一种工具,一般用于限制用户的请求的频率,也可以避免瞬间流量过大导致系统崩溃,或者稳定消息处理速率。并且有时候我们还需要使用...
      99+
      2023-04-02
      Go Redis实现限流算法 Go Redis限流算法 Go 限流算法
    • redis实现限流的三种方法
      今天小编给大家分享的是redis实现限流的三种方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。第一种:基于Redis的setnx的操作我们在使用R...
      99+
      2022-10-18
    • redis如何实现分布式限流
      Redis可以使用令牌桶算法来实现分布式限流。令牌桶算法是一种常用的限流算法,它通过维护一个固定容量的令牌桶,每秒钟往桶里放入一定数...
      99+
      2023-09-09
      redis
    • Redis中如何实现限流策略
      这篇文章将为大家详细讲解有关Redis中如何实现限流策略,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、简单的限流基本原理当系统处理能力有限,如何组织计划外的请求对系统...
      99+
      2022-10-19
    • Redis限流的实现方法有哪些
      本篇内容主要讲解“Redis限流的实现方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis限流的实现方法有哪些”吧!一、简单的限流基本原理当系统处理能力有限,如何组织计划外的请求对...
      99+
      2023-06-22
    • 使用Java实现Redis限流的方法
      1、概述   限流的含义是在单位时间内确保发往某个模块的请求数量小于某个数值,比如在实现秒杀功能时,需要确保在10秒内发往支付模块的请求数量小于500个。限流...
      99+
      2022-11-12
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作