当前位置: 首页 > news >正文

.NET Redis限制接口请求频率 滑动窗口算法

在.NET中使用Redis来限制接口请求频率(每10秒只允许请求一次)

NuGet setup
StackExchange.Redis

实现速率限制逻辑
在控制器或服务层中,编写Redis速率限制计数器。
设置Redis键
为每个用户或每个IP地址设置一个唯一的键。这个键将用于存储最后一次请求的时间戳和/请求计数。
检查时间戳
当请求到达时,从Redis中获取该键的值(时间戳)。如果键不存在或时间戳超过10秒,则允许请求并更新键的值(设置为当前时间戳)。
处理超过速率的请求
如果时间戳在10秒内,则拒绝或限制该请求(返回限制状态码)。

   private static readonly Lazy<ConnectionMultiplexer> LazyConnection = new Lazy<ConnectionMultiplexer>(() =>{// 配置Redis连接字符串 "localhost,abortConnect=false"  return ConnectionMultiplexer.Connect("localhost:6379");});private static ConnectionMultiplexer Connection => LazyConnection.Value;private static IDatabase Db => Connection.GetDatabase();public async Task<ActionResult> MyAction(){IPAddress clientIpAddress = HttpContext.Connection.RemoteIpAddress;string ipAddress = clientIpAddress.ToString();string redisKey = $"rate-limit:{ipAddress}"; // 构建Redis键名  // 获取当前时间戳(可以是Unix时间戳或任何你选择的格式)  long currentTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();// 尝试从Redis获取时间戳  var redisValue = await Db.StringGetAsync(redisKey);long lastTimestamp = redisValue.HasValue ? (long)redisValue : 0;// 检查是否超过10秒  if (currentTimestamp - lastTimestamp >= 10){// 如果超过10秒,则允许请求并更新Redis键  await Db.StringSetAsync(redisKey, currentTimestamp, TimeSpan.FromSeconds(10)); // 设置键的过期时间为10秒  return Content("Request allowed.");}else{// 如果未超过10秒,则拒绝请求  HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.TooManyRequests){ReasonPhrase = "Too Many Requests",Content = new StringContent("Rate limit exceeded. Please try again later.")};// 处理请求return Content("Please try again later. ");// throw new HttpResponseException(response); // 或者返回自定义的ActionResult  }}

扩展为参数

MyAction(string p)
//...
string redisKey = $"rate-limit:{p}";

请求
/MyAction?p=2
/MyAction?p=3

滑动窗口算法

滑动窗口算法(Sliding Window Algorithm)是一种用于解决字符串/数组 问题的算法,它通过维护一个窗口(即一个连续的子串或子数组),并在字符串或数组上滑动这个窗口来寻找满足特定条件的子串或子数组。以下是滑动窗口算法的主要内容和特点:

维护窗口:通过两个指针(左指针和右指针)来定义窗口的边界。
移动窗口:通过移动右指针来扩展窗口,同时根据问题的要求调整左指针来缩小窗口。
更新信息:在窗口滑动的过程中,根据需要更新一些数据结构(如哈希表)来保存所需的信息。

实现方法
步骤1.初始化:定义左指针和右指针,并初始化它们的位置。
步骤2.扩展窗口:向右移动右指针,扩展窗口,同时更新所需的信息(如字符频率的哈希表)。
步骤3.检查条件:当窗口满足特定条件时,开始收缩窗口。
步骤4.收缩窗口:向右移动左指针,缩小窗口,同时更新所需的信息。
步骤5.更新最优解:在收缩窗口的过程中,不断更新最优解(如最长子串、最短子串等)。
重复步骤:重复步骤2到步骤5,直到右指针到达字符串或数组的末尾。

在Redis中维护一个窗口内的请求时间戳列表,而不是仅仅存储最后一次请求的时间戳。移除超过窗口大小的时间戳。检查剩余的时间戳数是否超过了最大请求数 MaxRequests。如果超过,则返回超过的响应;否则,记录当前时间戳并允许请求。

			private const int MaxRequests = 5; // 最大请求数private const int WindowSizeInSeconds = 10; // 窗口大小(秒)//...// 获取Redis中存储的时间戳列表var redisValue = await Db.ListRangeAsync(redisKey);var timestamps = redisValue.Select(value => (long)value).ToList();// 移除窗口之外的时间戳timestamps = timestamps.Where(timestamp => currentTimestamp - timestamp <= WindowSizeInSeconds).ToList();if (timestamps.Count >= MaxRequests){// 如果请求数超过限制,则拒绝请求HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.TooManyRequests){ReasonPhrase = "Too Many Requests",Content = new StringContent("Rate limit exceeded. Please try again later.")};return Content("Please try again later.");}else{// 如果请求数未超过限制,则允许请求并记录当前时间戳timestamps.Add(currentTimestamp);await Db.ListRightPushAsync(redisKey, timestamps.Select(timestamp => (RedisValue)timestamp).ToArray());await Db.KeyExpireAsync(redisKey, TimeSpan.FromSeconds(WindowSizeInSeconds)); // 设置键的过期时间为窗口大小return Content("Request allowed.");}

End

相关文章:

.NET Redis限制接口请求频率 滑动窗口算法

在.NET中使用Redis来限制接口请求频率&#xff08;每10秒只允许请求一次&#xff09; NuGet setup StackExchange.Redis 实现速率限制逻辑&#xff1a; 在控制器或服务层中&#xff0c;编写Redis速率限制计数器。 设置Redis键&#xff1a; 为每个用户或每个IP地址设置一个唯一…...

Java List数据结构与常用方法

1.1 数据结构概述 Java的集合框架其实就是对数据结构的封装&#xff0c;在学习集合框架之前&#xff0c;有必要先了解下数据结构。 1.1.1 什么是数据结构 所谓数据结构&#xff0c;其实就是计算机存储、组织数据的方式。 数据结构是用来分析研究数据存储操作的&#xff0c;其实…...

Docker搭建redis-cluster集群

1. 前期准备 1.1 拉redis镜像 docker search redis docker pull redis1. 2 创建网卡 docker network create myredis --subnet 172.28.0.0/16#查看创建的网卡 docker network inspect myredisdocker network rm myredis #删除网卡命令 多个中间 空格隔开 docker network --h…...

实验室类管理平台LIMS系统的ui设计实例

实验室类管理平台LIMS系统的ui设计实例...

<PLC><西门子><工控>西门子博图V18中使用SCL语言编写一个CRC16-modbus校验程序

前言 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。 除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如…...

Linux - 文件管理高级 find、grep

0.管道 | 将前面命令的标准输出传递给管道作为后面的标准输入 1.文件查找 find find 进行文件查找时&#xff0c;默认进行递归查找&#xff0c;会查找隐藏目录下的文件 1.1 用法 # find 查找路径 查找条件... -type // 文件类型 f 普通文件 b 设备 d …...

DOS编程入门:探索基础、深入技巧与实战应用

DOS编程入门&#xff1a;探索基础、深入技巧与实战应用 DOS编程&#xff0c;作为计算机编程的基石之一&#xff0c;对于初学者来说&#xff0c;既是一种挑战&#xff0c;也是一次深入了解计算机底层运作的绝佳机会。本文将从四个方面、五个方面、六个方面和七个方面&#xff0…...

创建线程的技术难点

在软件开发中&#xff0c;创建线程并正确地管理它们是一个复杂而关键的任务&#xff0c;涉及的技术难点主要有&#xff1a; 线程同步&#xff1a;当多个线程需要访问共享资源时&#xff0c;必须确保它们以某种方式同步&#xff0c;以避免数据不一致或其他并发问题。例如&#…...

Android ViewPager和ViewPager2的区别

一、实现方式 ViewPager内部是通过继承ViewGroup来实现的&#xff0c;ViewPager2内部是通过RecyclerView来实现的&#xff08;效率更高&#xff09; 二、支持方向 ViewPager只能横向滑动&#xff0c;ViewPager2可以横向以及竖向滑动 三、采用的适配器 ViewPager有两个适配…...

Oracle数据库面试题-3

41. 请解释Oracle数据库中的内存顾问&#xff08;Memory Advisor&#xff09;的作用。 Oracle 数据库中的内存顾问&#xff08;Memory Advisor&#xff09; Oracle 数据库中的内存顾问是一个功能&#xff0c;它可以分析数据库的内存使用情况&#xff0c;并提供优化建议&#…...

21.过拟合和欠拟合示例

1. 背景介绍 在机器学习和深度学习中&#xff0c;过拟合和欠拟合是两个非常重要的概念。过拟合指的是模型在训练数据上表现很好&#xff0c;但在新的测试数据上效果变差的情况。欠拟合则是指模型无法很好地拟合训练数据的情况。这两种情况都会导致模型无法很好地泛化&#xff…...

使用import语句导入模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 创建模块后&#xff0c;就可以在其他程序中使用该模块了。要使用模块需要先以模块的形式加载模块中的代码&#xff0c;这可以使用import语句实现。im…...

一台FreeBSD笔记本突然鼠标乱动=>pf防火墙设置@FreeBSD

缘起 一台FreeBSD的笔记本&#xff0c;突然鼠标乱动 思考了下&#xff0c;可能原因有三&#xff1a; 1 无线鼠标干扰 正巧没带鼠标&#xff0c;但是插着无线鼠标usb&#xff0c;不知道是不是别人的鼠标跟这个usb串台了。 2 触摸板机械故障 也许是天热触摸板开始有故障了&…...

身份证OCR识别功能介绍

身份证OCR识别功能是一种基于光学字符识别&#xff08;OCR&#xff09;技术的解决方案&#xff0c;专门用于从身份证图像中快速、准确地提取和识别信息。以下是关于身份证OCR识别功能的详细介绍&#xff1a; 功能概述 身份证OCR识别功能通过高分辨率的摄像头或扫描仪获取身份证…...

一文看懂:MES定义和功能是什么,以及在数字化工厂的应用

MES应该是继ERP之后制造企业信息化最热门的管理软件&#xff0c;它适应产品个性化与敏捷化制造需求&#xff0c;满足生产过程精益管理而产生和发展起来的信息系统。 作为企业实现数字化与智能化的核心支撑技术与重要组成部分&#xff0c;MES在帮助制造企业走向数字化、智能化等…...

对 SQL 说“不”~

开发人员注意&#xff01; 您在当前的应用程序架构中是否面临这些问题&#xff1f; 对 SQL 数据库的高吞吐量。SQL 数据库中的瓶颈。 内存数据存储将是解决问题的方案。Redis 是市场上最受欢迎的内存数据存储和缓存选项。Redis 拥有广泛的生态系统&#xff0c;因为主要科技巨…...

【爱空间_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …...

web前端三大主流框架

一、介绍 目前&#xff0c;前端开发领域的三大主流框架是&#xff1a; React&#xff1a;React是由Facebook开发并维护的开源JavaScript库&#xff0c;用于构建用户界面。它提供了一种声明式的组件化开发方式&#xff0c;能够高效地创建交互性的用户界面。React具有高性能、可…...

git获取的项目无法运行

一、Unsupported engine 问题&#xff1a;在使用命令npm install下载依赖项的时候就遇到了这个问题&#xff0c;有帖子说多试几次&#xff0c;其实这是提示node版本问题&#xff0c;版本的更新出现兼容性问题&#xff0c;多试几次也没用。 解决方案&#xff1a; 更新node.js的…...

java 原生http服务器 测试JS前端ajax访问实现跨域

后端 package Httpv3;import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer;import java.io.IOException; import java.io.OutputStream; import java…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...