使用Redis实现分布式限流
一、限流场景与算法选择
1.1 为什么需要分布式限流
在高并发系统中,API接口的突发流量可能导致服务雪崩。传统的单机限流方案在分布式环境下存在局限,需要借助Redis等中间件实现集群级流量控制。
1.2 令牌桶算法优势
- 允许突发流量:稳定速率填充令牌,应对合理流量峰值
- 平滑限流:相比固定窗口算法更细腻的流量控制
- 弹性调整:动态修改令牌生成速率和桶容量
二、Redis核心实现原理
2.1 数据结构设计
Key: rate_limiter:{service_name}
Value:
{"tokens": 10, // 当前令牌数"last_time": 1717024000 // 最后更新时间(秒级时间戳)
}
2.2 原子操作保障
使用Redis的Lua脚本保证操作的原子性:
local key = KEYS[1]
local now = tonumber(ARGV[1])
local capacity = tonumber(ARGV[2])
local rate = tonumber(ARGV[3])
local requested = tonumber(ARGV[4])local data = redis.call("HMGET", key, "tokens", "last_time")
local tokens = tonumber(data[1]) or capacity
local last_time = tonumber(data[2]) or nowlocal delta = math.floor((now - last_time) * rate)
if delta > 0 thentokens = math.min(tokens + delta, capacity)last_time = now
endlocal result = 0
if tokens >= requested thentokens = tokens - requestedresult = 1
endredis.call("HMSET", key, "tokens", tokens, "last_time", last_time)
redis.call("EXPIRE", key, 86400) // 自动过期清理return result
三、Java完整实现代码
3.1 添加依赖(pom.xml)
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.4.6</version>
</dependency>
3.2 Redis限流器核心类
public class RedisRateLimiter {private final JedisPool jedisPool;private final String serviceKey;private final int capacity; // 桶容量private final double rate; // 令牌/秒private static final String LUA_SCRIPT = "..." // 上述Lua脚本public boolean tryAcquire(int permits) {try (Jedis jedis = jedisPool.getResource()) {long now = Instant.now().getEpochSecond();Object result = jedis.eval(LUA_SCRIPT,Collections.singletonList(serviceKey),Arrays.asList(String.valueOf(now),String.valueOf(capacity),String.valueOf(rate),String.valueOf(permits)));return "1".equals(result.toString());}}
}
3.3 使用示例
// 初始化限流器(每秒2个令牌,桶容量10)
RedisRateLimiter limiter = new RedisRateLimiter(jedisPool, "order_api", 10, 2.0);public Response processRequest(Request request) {if (!limiter.tryAcquire(1)) {throw new RateLimitExceededException("请求过于频繁");}// 处理业务逻辑return doBusiness(request);
}
四、高级优化策略
4.1 预热机制
// 冷启动时渐进式填充令牌
private void warmUp() {long warmupPeriod = 30_000; // 30秒预热期double coldFactor = 3; // 冷启动系数double warmupRate = capacity * coldFactor / (warmupPeriod/1000);// 动态调整rate参数...
}
4.2 动态规则配置
// 监听配置中心变更
@NacosConfigListener(dataId = "rate_limit_rules")
public void updateRules(String config) {// 解析JSON配置并更新capacity/rate
}
4.3 多维度限流
-- 在Lua脚本中增加维度参数
local key = "rate_limiter:" .. service_name .. ":" .. user_id
五、生产环境注意事项
-
Redis集群模式:使用Hash Tag确保相同资源的请求路由到同一节点
String serviceKey = "{order_api}:" + userId;
-
性能监控:
redis-cli info stats | grep total_commands_processed
-
降级策略:
- 快速失败模式(默认)
- 排队等待模式(配合阻塞队列)
- 动态降级(根据系统负载自动调整rate)
-
异常处理:
try {return tryAcquire(permits); } catch (JedisException e) {// Redis不可用时降级为本地限流return localLimiter.tryAcquire(); }
总结
本文实现的Redis分布式限流方案已在多个生产环境验证,支撑百万级QPS的电商系统。建议在实际使用中结合监控告警系统,并建立限流规则评审机制,避免因错误配置影响正常业务。
相关文章:
使用Redis实现分布式限流
一、限流场景与算法选择 1.1 为什么需要分布式限流 在高并发系统中,API接口的突发流量可能导致服务雪崩。传统的单机限流方案在分布式环境下存在局限,需要借助Redis等中间件实现集群级流量控制。 1.2 令牌桶算法优势 允许突发流量:稳定速…...
【MySQL学习】存储过程
目录 一、定义 二、基本语法 1.创建存储过程 2.删除存储过程 3.查看存储过程 三、控制语句 1.变量声明与赋值 四、游标(Cursor) (1)声明游标 (2)处理游标结束 (3)打开游标 …...
Bp靶场 - Jwt
你知道JWT漏洞如何进行攻击利用吗?快来看一看如何利用JWT漏洞进行攻击利用把!https://mp.weixin.qq.com/s/2iBIEGnkiliprsuHyY5Udg...
手机上的APN是什么,该怎么设置
网上说改个APN就可以让网速快几倍,那到底APN是个什么东西,真的能让网速快几倍吗? APN的作用 网络连接基础:APN(接入点名称)是手机连接移动网络的“桥梁”,负责识别运营商网络类型(…...
[bug]langchain agent报错Invalid Format: Missing ‘Action Input:‘ after ‘Action:‘
在学习langchain的agent时候,采用ollama调用本地的deepseek-r1:32b来做一个agent,代码如下: def create_custom_agent():llm ChatOllama(model"deepseek-r1:32b", temperature0.5)memory ConversationBufferWindowMemory(memory…...
blender关联复制与Three.js网格和材质共享验证
blender和three.js小白的学习之路。 最近看到Three.js官网上说,模型合并是一个很好的优化性能的方式,因为渲染2000个物体总要比一次性渲染一个模型要来的慢。很有道理! 但此时就不禁思考一个问题,现有的模型进行合并通过blender…...
Spark宽窄依赖与Join优化:协同划分与非协同划分的底层逻辑
在大数据领域,Spark的性能优化始终是开发者关注的焦点。理解宽依赖(Wide Dependency)和窄依赖(Narrow Dependency)的底层原理,能够帮助我们从根本上优化Join操作的性能。本文将通过这两个核心概念ÿ…...
每日算法-250416
今天我们来探讨两道可以通过贪心算法解决的 LeetCode 题目。 什么是贪心算法? 贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最…...
python爬虫降低IP封禁,python爬虫除了使用代理IP和降低请求频率,还有哪些方法可以应对IP封禁?
文章目录 前言1. 利用 CDN 节点2. 模拟真实用户行为3. 使用 IP 池轮换策略4. 处理 Cookie 和会话信息5. 分布式爬虫 前言 除了使用代理 IP 和降低请求频率,以下这些方法也能应对 IP 封禁: Python 3.13.2安装教程(附安装包)Python…...
NLP高频面试题(四十五)——PPO 算法在 RLHF 中的原理与实现详解
近端策略优化(Proximal Policy Optimization, PPO)算法是强化学习领域的一种新颖且高效的策略优化方法,在近年大规模语言模型的人类反馈强化学习(Reinforcement Learning with Human Feedback, RLHF)中发挥了关键作用。本文将以学术严谨的风格,详细阐述 PPO 算法的原理及…...
bert项目解析
读取csv def read_file(file_path):data []label []with open(file_path, "r", encoding"utf-8") as file:reader csv.reader(file)next(reader) # 跳过标题行for row in reader:if len(row) < 2:print(f"跳过不完整行: {row}")continue…...
ubuntu20.04 Android14编译环境配置
ubuntu 更新和必要安装 sudo apt update sudo apt install git sudo apt install python2-minimal sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 2 sudo upda…...
lombok requires enabled annotation processing
这个错误信息表明你在使用 Lombok 时,编译器无法正常工作,因为 注解处理器(Annotation Processing) 没有被启用。Lombok 是一个 Java 库,它通过注解处理器在编译时自动生成代码(例如 Getter、Setter、NoArg…...
应用系统中的报表开发成本知多少?
应用系统的开发过程中,报表的业务虽然不算太难,但投入的开发成本可不一定小,因为总会有没完没了的报表要去做,成本的投入不容小觑 下面我们就来分析一下报表开发成本的构成,看看它是多是少 报表的开发成本,…...
STM32F103ZET6移植FATFS文件系统教程(W25Q32)
一、FATFS核心特性 跨平台支持 支持FAT12/FAT16/FAT32格式,兼容Windows文件系统; 采用标准C语言编写,代码量小且支持RTOS。 配置灵活性 通过宏定义实现功能裁剪,例如: FF_FS_READONLY:设为1时禁…...
数据泄露防护系统:全面保护企业信息安全的功能解析
随着信息技术的快速发展,数据泄露事件频发,给企业带来了巨大的经济损失和声誉损害。为了有效应对这一挑战,越来越多的企业开始部署专业的数据泄露防护(DLP)系统。安固软件作为一款领先的数据防泄漏解决方案,…...
【野火模型】利用深度神经网络替代 ELMv1 野火参数化:机制、实现与性能评估
目录 一、ELMv1 野火过程表示法(BASE-Fire)关键机制野火模拟的核心过程 二、采用神经网络模拟野火过程三、总结参考 一、ELMv1 野火过程表示法(BASE-Fire) ELMv1 中的野火模型(称为 BASE-Fire)源自 Commun…...
【WPF】 在WebView2使用echart显示数据
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、NuGet安装WebView2二、代码部分1.xaml中引入webview22.编写html3.在WebView2中加载html4.调用js方法为Echarts赋值 总结 前言 为了实现数据的三维效果&…...
java实现二叉树的前序、中序、后序遍历(递归和非递归方式)以及层级遍历
java实现二叉树的前序、中序、后序遍历以及层级遍历 一、二叉树节点定义二、递归方式1.前序遍历2.中序遍历3.后序遍历 三、非递归方式1.前序遍历2.中序遍历3.后序遍历4.层级遍历5.分层打印 四、测试用例 一、二叉树节点定义 class TreeNode {int val;TreeNode left;TreeNode r…...
学习笔记十三—— 理解 Rust 闭包:从语法到 impl Fn vs Box<dyn Fn>
🧠 理解 Rust 闭包:从语法到 impl Fn vs Box 📚 目录 闭包是什么?和普通函数有什么不同?闭包的语法长什么样?闭包“捕获变量”是什么意思?闭包和所有权的关系Fn、FnMut、FnOnce 三种闭包类型的…...
Linux虚拟机filezilla总是连不上
刚好有两个虚拟机,测试了一下问题所在 从第一个到第二个需要设置什么 image PNG 68.59KB image PNG 134.39KB ChatGLM 从第一个到第二个需要设置开启ssh服务,具体步骤如下: 输入以下命令来启动SSH服务: bash 复制 sud…...
NO.94十六届蓝桥杯备战|图论基础-单源最短路|常规dijkstra|堆优化dijkstra|bellman-ford|spfa(C++)
在图G中,假设 v i v_{i} vi和 v j v_{j} vj为图中的两个顶点,那么 v i v_{i} vi到 v j v_{j} vj路径上所经过边的权值之和就称为带权路径⻓度。 由于 v i v_{i} vi到 v j v_{j} vj的路径可能有多条,将带权路径⻓度最短的那条路径…...
DISCO:利用大型语言模型提取反事实
DISCO: Distilling Counterfactuals with Large Language Models - ACL Anthologyhttps://aclanthology.org/2023.acl-long.302/ 1. 概述 尽管在自然语言处理(NLP)领域针对各种推理任务取得了巨大进展(Wang 等, 2018, 2019a;Xu 等, 2020),但数据集偏差仍然是构建鲁棒模型…...
若依微服务版启动小程序后端
目录标题 本地启动,dev对应 nacos里的 xxx-xxx-dev配置文件 本地启动,dev对应 nacos里的 xxx-xxx-dev配置文件...
C语言 - 深拷贝与浅拷贝详解
深拷贝与浅拷贝详解 在 C 语言编程中,处理指针和动态内存是常见任务。在涉及数据拷贝操作时,我们经常会听到“深拷贝”和“浅拷贝”这两个术语。理解它们之间的区别对于避免程序中的内存错误和数据覆盖问题至关重要。 本文将全面讲解 C 语言中的深拷贝与…...
Serverless集群搭建:Knative
文章目录 Knative搭建1.准备工作安装Kubernetes安装 Istio 2.部署Knative Knative搭建 搭建流程图: 1.准备工作 准备工作 ● 本安装操作中的步骤 bash 适用于 MacOS 或 Linux 环境。对于 Windows,某些命令可能需要调整。 ● 本安装操作假定您具有现有…...
今日行情明日机会——20250416
指数在区间震荡,还需要等突破下跌趋势企稳 2025年4月16日涨停的主要行业方向分析 1. 外贸(9家涨停) 细分领域:跨境物流、纺织出口、供应链服务。代表个股: 五板:泰慕士(纺织服装出口龙头&…...
STM32基础教程——DMA
目录 前言 编辑 技术实现 接线图 代码实现 技术要点 DMA时钟 DMA初始化 DMA数据传输设置 数据改变与显示 实验结果 问题记录 前言 DMA(Direct Memory Access)直接存储器存取,用来提供在外设和存储器 之间或者存储器和存储器之间的高速数据传输。无需…...
Node.js 中文件系统模块(`fs`)的详细总结,包括定义、作用、各种写入方式及使用场景
Node.js 中文件系统模块(fs)的详细总结,包括定义、作用、各种写入方式及使用场景: 🧩 一、fs 模块简介 ✅ 定义 fs(File System)是 Node.js 官方内置模块,用于实现对文件和目录的操…...
MyBatis与MyBatis-Plus:字段自动填充的两种实现方式
目录 1. 使用 MyBatis 拦截器实现字段自动填充 2. 使用 MyBatis-Plus 实现字段自动填充 1. 使用 MyBatis 拦截器实现字段自动填充 实现步骤 创建拦截器 实现 MyBatis 的 Interceptor 接口,通过拦截 MyBatis 执行的 SQL 操作来自动填充公共字段 Intercepts({Signa…...
比特率、码元速率(波特率)的定义、关系及相关计算公式
一、相关定义 (一)比特率 比特率(Bit Rate):单位时间内传输的二进制比特数,是信息传输速率的度量。单位:比特每秒(bit/s,bps)。公式:比特率 传…...
炫云平台全面支持Blender4.4云渲染
随着世界渲染大赛众多优秀作品被大家关注,Blender作为建模渲染一体化的软件,也是众多3D艺术家最常用的软件之一。云渲染自然是提升创作效率必不可少的工作。这篇文章说一下炫云云渲染平台近期对Blender云渲染支持的情况。 首先,炫云客户端已经…...
Python自学第1天:变量,打印,类型转化
突然想学Python了。经过Deepseek的推荐,下载了一个Python3.12安装。安装过程请自行搜索。 乖乖从最基础的学起来,废话不说了,上链接,呃,打错了,上知识点。 变量的定义 # 定义一个整数类型的变量 age 10#…...
Flutter 从零到一
iOS 调试与开发工具指南 真机调试 Xcode run 在控制台获取 Dart VM service URIVSCode 点击 Cmd Shift P 选择 Debug: Attach to Flutter on Device粘贴 the URI 后点击 Enter 对于iOS开发者来说,使用appuploader这样的iOS开发助手可以简化真机调试的准备工作。…...
ocr-身份证正反面识别
在阿里云官网,申请一个token [阿里官方]身份证OCR文字识别_API专区_云市场-阿里云 (aliyun.com) 观察一下post请求body部分json字符串,我们根据这个创建一个java对象 先默认是人像面 public class IdentityBody {public String image;class configure…...
深入解析Spring Boot核心组件及其关键功能
【版本:spring-boot-2.1.3.RELEASE】 深入Spring Boot核心组件 Spring Boot是一个流行的框架,简化了基于Spring的应用程序的开发和部署。它通过自动配置和“开箱即用”的特性,使得开发者可以快速启动和运行应用程序。在Spring Boot中&#x…...
JVM 调优不再难:AI 工具自动生成内存优化方案
在 Java 应用程序的开发与运行过程中,Java 虚拟机(JVM)的性能调优一直是一项极具挑战性的任务,尤其是内存优化方面。不合适的 JVM 内存配置可能会导致应用程序出现性能瓶颈,甚至频繁抛出内存溢出异常,影响业…...
分层式设备控制架构、分布式微服务架构及插件化架构
在现代高端装备制造(如半导体设备、精密自动化系统)中,分层式设备控制架构、分布式微服务架构和插件化架构是提升系统灵活性、实时性和可扩展性的核心技术。以下从设计原理、实现方式及行业应用三个维度展开说明:  1.…...
上门服务 APP 30 亿营收商业模式在乌干达的技术赋能与实践
不久前,非洲乌干达出现黑人女技师提供上门足疗服务的消息引发关注。据了解,当地一次40分钟的上门按摩服务仅需约40元人民币,价格仅为国内同类服务的十分之一。这一现象折射出全球健康服务行业正在经历的数字化转型浪潮。 国内领先的上门服务平…...
Chemical Review IF=51.4 综述 | 柔性机器人的当下与未来:材料、技术与应用的深度融合
2025.03.31. 新加坡南洋理工大学研究团队在《Chemical Reviews》期刊上发表 “Soft Materials and Devices Enabling Sensorimotor Functions in Soft Robots” 综述型文章。软机器人的传感器运动功能对其与环境交互至关重要,本文全面综述了相关软材料和设备。传感技…...
Python抽象基类
abstractmethod 详解 abstractmethod 是 Python 中 abc 模块(Abstract Base Classes,抽象基类)提供的一个装饰器,用于定义抽象方法。抽象方法是一种在基类中声明但不实现具体逻辑的方法,强制子类必须实现该方法。以下…...
计算机网络中各种物理量的单位总结
在计算机网络中,数据速率的单位容易混淆,以下是清晰总结: 一、基本单位区分 比特(bit)与字节(Byte) 小写 b 表示 比特(bit),是数据传输的基本单位。 大写 B…...
PCIE网卡驱动DMA初始化配置
1. DMA 启用的时机 e1000e 驱动在 设备初始化阶段 启用 DMA,具体步骤如下: (1) PCIe 设备初始化 调用路径: e1000_probe() → e1000_sw_init() → e1000_init_hw() → e1000_configure() 关键操作: 启用 PCIe 设备的 DMA 主控模…...
音视频小白系统入门笔记-1
本系列笔记为博主学习李超老师课程的课堂笔记,仅供参阅 课程传送门:音视频小白系统入门课 音视频基础ffmpeg原理 往期课程笔记传送门:音视频小白系统入门笔记-0 课程实践代码仓库:传送门 音频采集 命令行采集 Android端音频…...
技术速递|使用 BrowserStack App Automate 和 Appium UI 测试 .NET MAUI 应用
作者:Sweeky&Gerald 排版:Alan Wang 本文是 Gerald 的博客《开始使用 Appium 测试 .NET MAUI 应用的 UI 》中创建的 .NET MAUI – 使用 Appium 和 NUnit 进行 UI 测试的续篇。 在本篇博客中,我们将了解如何使用 BrowserStack App Automa…...
在多系统环境中实现授权闭环,Tetra Pak 借助CodeMeter打造食品工业的安全自动化体系
一、 行业背景与安全新挑战 在食品加工自动化不断深化的背景下,食品安全、功能安全与知识产权保护的需求日益迫切。Tetra Pak 作为全球领先的食品加工和包装解决方案提供商,业务遍布 160 多个国家,涵盖从配料混合、碳酸化处理到全线自动包装。…...
Nginx+SpringBoot跨域那些事儿(多域名跨域加强版——Nginx配置详解)
嘿,小伙伴们,咱们接着上回书说到,当你的应用需要支持多个域名跨域访问时,Nginx+SpringBoot这对黄金搭档绝对是你的不二之选!今天,咱们就深入聊聊如何在Nginx中配置多个域名跨域,让你的应用更加灵活、强大! 一、跨域问题再科普(多域名跨域场景) 在前后端分离开发中,…...
基于Python的App流量大数据分析与可视化方案
一、引言 App流量数据通常包括用户的访问时间、停留时间、点击行为、页面跳转路径等信息。这些数据分散在不同的服务器日志、数据库或第三方数据平台中,需要通过有效的技术手段进行整合和分析。Python在数据科学领域的广泛应用,得益于其简洁的语法、强大…...
windows下使用nginx + waitress 部署django
架构介绍 linux一般采用nginx uwsgi部署django,在Windows下,可以取代uwsgi的选项包括Waitressa、Daphnea、Hypercoma和Gunicorna(通过WSLa 运行)。windows服务器一般采用nginx waitress 部署django,,他们的关系如下 django是WEB应用…...
openssh离线一键升级脚本分享(含安装包)
查看当前的版本 [rootmyoracle ~]#ssh -V相关安装包下载地址 openssh下载地址:http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssl下载地址:https://www.openssl.org/source/zlib下载地址:http://www.zlib.net/今天演示从7.4升级…...