利用 Redis 和 Lua 实现高效的限流功能

news2024/11/27 0:34:35

简介

在现代系统中,限流是一种重要的机制,用于控制服务端的流量并保护系统免受恶意攻击或请求泛滥的影响。本文将介绍如何利用 Redis 和 Lua 结合实现高效的限流功能。

一、什么是限流

限流指的是对系统中的请求进行控制和调节,确保系统在承受压力时能够正常运行,不会因为突然的大量请求导致系统宕机或服务质量下降。限流在系统中具有至关重要的作用,可以平稳地处理请求流量,防止系统过载。

二、什么是Redis

Redis是一个高性能的内存数据库,具有快速的读写速度和丰富的数据结构支持。在限流场景中,Redis可以作为一个高效的缓存和计数工具,帮助实现限流功能。

三、什么是lua

Lua是一种轻量级的脚本语言,它具有简洁的语法和高效的执行性能。

四、限流要用lua+Redis而不用Java、Python 等语言呢?

  • 性能和原子性: Lua脚本可以在Redis服务器端原子性地执行多个命令,避免了多次网络通信的开销,提高了性能和原子性。相比之下,用Java或Python实现的限流算法需要多次与Redis进行通信,性能相对较低。

  • 便捷性: Lua脚本可以直接在Redis服务器端执行,无需额外部署其他语言的运行环境,更加灵活和便捷。

  • Redis支持: Redis天然支持Lua脚本,可以直接执行,不需要额外的配置和插件。而如果使用Java或Python,需要额外的库或框架来与Redis进行交互。

五、限流算法选择

5.1 令牌桶算法

令牌桶算法中,存在一个令牌桶,可以往桶中添加令牌。每个令牌代表一个处理请求的许可。如果请求到了,桶中有足够的令牌,择允许处理该请求,同时消耗相应数量的令牌。如果桶中没有足够的令牌,则拒接该请求或将请求放入队列等待令牌。

5.2 漏桶算法

漏桶算法中,存在一个固定容量的漏桶,以固定的速率处理请求。如果请求到来,放入漏桶中,如果漏桶已满,则拒绝请求,如果漏桶未满,则按照固定的速率处理请求。

六、lua+Redis实现令牌桶算法

local key = KEYS[1] -- 获取传入lua脚本的第一个keys参数,用作存储令牌数目的键名
local limit = tonumber(ARGV[1]) -- 将传入lua脚本的第一个ARGV参数转换为整数,表示桶的容量
local current = tonumber(redis.call('get', key) or "0")
-- 通过Redis的GET命令获取当前令牌桶中的令牌数量,如果没有获取到则默认为0,并将其转换为整数。
​
if current + 1 > limit then -- 判断当前令牌桶中的令牌数量加1后是否超过阈值
    return 0 -- 超过表示请求被限流,返回0
else
    redis.call('INCR', key) -- 通过Redis的INCR命令将令牌桶中的数量加1,表示通过了一个请求
    redis.call('EXPIRE', key, ARGV[2]) -- 设置令牌桶的过期时间为ARGV 参数中指定的时间
 
    return 1  -- 返回1,表示通过限流检查
end

七、lua+Redis实现漏桶算法

local key = KEYS[1] -- 限流器的键名
local capacity = tonumber(ARGV[1]) -- 漏桶的容量
local rate = tonumber(ARGV[2]) -- 漏桶的速率
local now = tonumber(ARGV[3]) -- 当前时间戳
local interval = 1 / rate -- 时间间隔,即每个请求需要等待的时间
​
local water = tonumber(redis.call('get', key) or "0") -- 获取漏桶中的水滴数量
local lastLeakTime = tonumber(redis.call('get', key .. ':last_leak_time') or "0") -- 上次漏水的时间戳
​
local elapsed = math.max(0, now - lastLeakTime) -- 计算当前时间与上次漏水的时间间隔
​
water = water - elapsed * rate -- 根据时间间隔计算漏水数量,并更新漏桶中的水滴数量
​
if water < 0 then
    water = 0 -- 水滴数量不会低于0
end
​
water = water + 1 -- 新的请求加入漏桶中
​
if water > capacity then
    return 0 -- 漏桶已满,拒绝请求
else
    redis.call('set', key, water) -- 更新漏桶中的水滴数量
    redis.call('set', key .. ':last_leak_time', now) -- 更新上次漏水的时间戳
    return interval -- 返回请求需要等待的时间间隔
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1492849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx 可视化管理软件 Nginx Proxy Manager

一、简介 Nginx Proxy Manager 是一款开源的 Nginx 可视化管理界面&#xff0c;基于 Nginx 具有漂亮干净的 Web UI 界面。他允许用户通过浏览器界面轻松地管理和监控 Nginx 服务器&#xff0c;可以获得受信任的 SSL 证书&#xff0c;并通过单独的配置、自定义和入侵保护来管理…

ARM单片机中程序在ROM空间和RAM空间的分布(分散加载文件,Scatter-Loading Description File)

对于 K e i l u V i s i o n I D E Keil\quad uVision\quad IDE KeiluVisionIDE&#xff0c;程序编译好之后&#xff0c;代码的下载位置&#xff08; R O M ROM ROM空间&#xff09;以及代码运行的时候使用的 R A M RAM RAM空间&#xff08; R A M RAM RAM空间&#xff09;默认…

第二证券|重大转变!全球资金正重回中国股市!

外资巨头最新发声。 摩根士丹利在最新发布的陈述中称&#xff0c;全球资金正在重返我国股市。跟着部分基金对我国商场的看跌心情有所平缓&#xff0c;全球长时间出资者撤出我国股票商场&#xff08;A股和港股&#xff09;的举动现已按下暂停键。 按下暂停键或许是一个前期痕迹…

leetcode刷题(javaScript)——二叉树、平衡二叉树相关场景题总结

二叉树的知识点很多&#xff0c;在算法刷题中需要有想象力的数据结构了。主要是用链表存储&#xff0c;没有数组更容易理解。在刷二叉树相关算法时&#xff0c;需要注意以下几点&#xff1a; 掌握二叉树的基本概念&#xff1a;了解二叉树的基本概念&#xff0c;包括二叉树的定义…

pytorch什么是梯度

目录 1.导数、偏微分、梯度1.1 导数1.2 偏微分1.3 梯度 2. 通过梯度求极小值3. learning rate 1.导数、偏微分、梯度 1.1 导数 对于yx 2 2 2 的导数&#xff0c;描述了y随x值变化的一个变化趋势&#xff0c;导数是个标量反应的是变化的程度&#xff0c;标量的长度反应变化率的…

next/future/image图片根据外部容器100%填充

官网文档地址&#xff1a; https://nextjs.org/docs/pages/api-reference/components/image 主要需要使用属性fill。外部元素需要设置好position:relative <Imagexsrc"/images/1.jpg"fillsizes100vw />

浅谈块存储、文件存储、对象存储

**块存储、文件存储和对象存储各自有其独特的特点和适用场景**。具体来说&#xff1a; 1. **块存储**&#xff1a; - 描述&#xff1a;块存储将存储空间分割成固定大小的块&#xff0c;这些块可以直接映射到主机操作系统。它提供的是原始的存储空间&#xff0c;不带文件系统…

hive实战项目:旅游集市数仓建设

旅游集市数仓建设 文章目录 旅游集市数仓建设为什么要设计数据分层&#xff1f;分层设计ODS&#xff08;Operational Data Store&#xff09;&#xff1a;数据运营层DW&#xff08;Data Warehouse&#xff09;&#xff1a;数据仓库层DWD&#xff08;Data Warehouse Detail&…

软考63-上午题-【面向对象技术】-面向对象的基本概念2

一、动态绑定、静态绑定 1-1、动态绑定、静态绑定的定义 编译时进行的绑定 静态绑定 运行时进行的绑定 动态绑定 动态绑定&#xff0c;和类的继承和多态想关联的。 在运行过程中&#xff0c;当一个对象发送消息请求服务时&#xff0c;要根据接受对象的具体情况将请求的操作…

gitlab的安装

1、下载rpm 安装包 (1)直接命令下载 wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.6.10-ce.0.el7.x86_64.rpm&#xff08;2&#xff09;直接去服务器上下载包 Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source…

html标签之列表标签,含爱奇艺,小米,腾讯,阿里

什么是css块元素&#xff1f; 块级元素是独占一行显示的。它的兄弟元素必定不会与其在同一行中&#xff08;除非脱离了文档流&#xff09;。通俗点来说&#xff0c;就是块元素(block element)一般是其他元素的容器元素&#xff0c;能容纳其他块元素或内联元素。 css块元素的三…

Mol2文件处理-拆分、合并、提取名称、计数与格式转换

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、Mol2文件合并二、Mol2文件拆分为含有单个分子的文件三、Mol2文件分子名称修改与提取3.1 分子名称修改去除空格3.2 文件名称提取 四、Mol2文件包含分子计数4.1 Mol2文件中分子计数4.2 分子计数传…

容器化软件应用简化传统设备的连接

| Docker容器如何简化工业物联网解决方案 制造和包装工厂可通过集成IT和OT技术来改善运营&#xff0c;从而释放预测性维护、数据分析以及接入强大的企业管理应用等优势。然而&#xff0c;对于缺乏员工、时间或资源的企业而言&#xff0c;实施工业物联网解决方案并不容易。对此…

Nircmd集成定时执行专家之后的使用场景

Nircmd工具拥有了定时执行功能之后&#xff0c;可以用于以下场景&#xff1a; 1. 自动化日常工作 定时清理系统垃圾文件定时备份重要文件定时关闭或重启电脑定时发送邮件或短信定时执行其他程序或脚本 2. 监控系统状态 定时检查系统温度定时检查磁盘空间定时检查网络连接定时…

浏览器工作原理与Javascript高级(异步)

总体介绍 浏览器运行是多进程的&#xff0c;包括主进程、渲染进行、网络进程和GPU进程等等 解析HTML时(渲染进程)用到两大引擎&#xff0c;一个是渲染引擎&#xff08;用于渲染页面&#xff09;、一个是JS引擎用于解析JS代码。又JS引擎运行是单线程的&#xff0c;所以渲染和 …

【LeetCode:98. 验证二叉搜索树 + 递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

消息队列-kafka-服务端处理架构(架构,Topic文件结构,服务端数据的一致性)

服务端处理架构 资料来源于网络 网络线程池&#xff1a; 接受请求&#xff0c;num.network.threads&#xff0c;默认为 3&#xff0c;专门处理客户的发送的请求。 IO 线程池&#xff1a; num.io.threads&#xff0c;默认为 8&#xff0c;专门处理业务请求。也就是它不负责发…

CSS盒模型居中方法,web开发问题

CSS 篇 link 与 import 的区别 link 是 HTML 方式&#xff0c; import 是CSS方式link 最大限度支持并行下载&#xff0c; import 过多嵌套导致串行下载&#xff0c;出现 FOUC (文档样式短暂失效)link 可以通过 rel"alternate stylesheet" 指定候选样式浏览器对 lin…

数据结构学习(四)高级数据结构

高级数据结构 1. 概念 之所以称它们为高级的数据结构&#xff0c;是因为它们的实现要比那些常用的数据结构要复杂很多&#xff0c;能够让我们在处理复杂问题的过程中&#xff0c; 多拥有一把利器&#xff0c;同时掌握好它们的性质&#xff0c;以及所适应的场合&#xff0c;在…

第十篇:如何利用人工智能技术做好营销流量整形管理?(Traffic Shaping)- 我为什么要翻译介绍美国人工智能科技巨头IAB公司

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市​​​​​​​。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先…