使用令牌桶算法通过redis实现限流

令牌桶算法是一种常用的限流算法,它可以平滑地控制请求的处理速率。在 Java 中结合 Redis 实现令牌桶算法,可以利用 Redis 的原子操作来保证多节点环境下的限流效果。

一 实现思路

  1. 初始化令牌桶:在 Redis 中存储令牌桶的相关信息,如令牌数量、令牌桶容量、上一次更新时间等。
  2. 添加令牌:根据时间间隔,计算需要添加到令牌桶中的令牌数量,并更新令牌桶的令牌数量。
  3. 获取令牌:尝试从令牌桶中获取指定数量的令牌,如果令牌数量足够,则返回成功;否则返回失败。

二 Redis Lua 脚本

编写一个 Lua 脚本来处理令牌桶的逻辑。lua脚本会在 Redis 执行时保证原子性。

-- 最大令牌个数(qps)
local limit = tonumber(ARGV[1]) 
-- 令牌生成速率
local rate = tonumber(ARGV[2]) 
-- 当前时间秒*1000=毫秒
local now = redis.call('TIME')[1] * 1000
-- 剩余可用的令牌个数
local tokens = tonumber(redis.call('GET', KEYS[1]) or 0)
-- 上次访问时间戳(单位毫秒)
local lastTimestamp = tonumber(redis.call('GET', KEYS[2]) or 0)
-- 本次访问时间戳-上次访问时间戳
local elapsedTime = now - lastTimestamp
-- 计算本次访问与上次访问之间需要放入的令牌个数=上次剩余的令牌数+本次访问与上次访问之间差的令牌数
local newTokens = tokens + elapsedTime * rate / 1000
-- 如果需要放入的令牌个数超过限制的最大令牌个数,则直接使用最大令牌个数
if newTokens > limit then
	newTokens = limit 
end 
-- 如果需要放入的令牌个数小于1,则意味着无法获取到锁
if newTokens < 1 then
	return 0 
else
-- 获取到锁,则更新剩余可获取的锁个数-1,更新本次访问时间戳
	redis.call('SET', KEYS[1], newTokens - 1)
	redis.call('SET', KEYS[2], now)
	return 1 
end

三 Java 实现

public class RedisRateLimiter {

  private JedisPool jedisPool;

  private String LUA_SCRIPT = "上面的lua脚本替换到此处";

  public RedisRateLimiter(JedisPool jedisPool) {
    this.jedisPool = jedisPool;
  }

  public boolean tryAcquire(String key, int rate, int capacity) {
        try (Jedis jedis = jedisPool.getResource()) {
      Object result = jedis.eval(LUA_SCRIPT,
          Arrays.asList(key, key + ":timestamp"), Arrays.asList(capacity, rate));
      long response = (Long) result;
      return response != 0;
    } catch (Exception e) {
        return false;
    }
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

吴恩达深度学习——卷积神经网络实例分析

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 LeNet-5AlexNetVGG-16ResNets残差块 1*1卷积 LeNet-5 输入层&#xff1a;输入为一张尺寸是 32 32 1 32321 32321的图像&#xff0c;其中 32 32 3232 3232是图像的长和宽&…

利用 IMU 估计人体关节轴向和位置 —— 论文推导

Title: 利用 IMU 估计人体关节轴向和位置 —— “Joint axis and position estimation from inertial measurement data by exploiting kinematic constraints” —— 论文推导 文章目录 I. 论文回顾II. 铰接关节的约束1. 铰接关节约束的原理2. 铰接关节约束的梯度3. 铰接关节约…

oracle ORA-27054报错处理

现象 在oracle执行expdp&#xff0c;rman备份&#xff0c;xtts的时候,由于没有足够的本地空间&#xff0c;只能使用到NFS的文件系统但有时候会出现如下报错 ORA-27054: NFS file system where the file is created or resides is not mounted with correct options根据提示信…

python模拟键盘输入(可视化界操作面)

因为受到一些限制&#xff0c;无法在输入框进行文本的复制粘贴&#xff0c;这时我们便需要模拟键盘输入一些文本内容&#xff0c;话不多说&#xff0c;直接上干货&#xff08;文末附成品工具&#xff0c;需要自取&#xff0c;操作简单无脑&#xff0c;工具功能&#xff1a;将粘…

k8s部署go-fastdfs

前置环境:已部署k8s集群,ip地址为 192.168.10.1~192.168.10.5,总共5台机器。 1. 创建provisioner制备器(如果已存在,则不需要) 制备器的具体部署方式可参考我的上一篇文章: k8s部署rabbitmq-CSDN博客文章浏览阅读254次,点赞3次,收藏5次。k8s部署rabbitmqhttps://blo…

DeepSeek在FPGA/IC开发中的创新应用与未来潜力

随着人工智能技术的飞速发展&#xff0c;以DeepSeek为代表的大语言模型&#xff08;LLM&#xff09;正在逐步渗透到传统硬件开发领域。在FPGA&#xff08;现场可编程门阵列&#xff09;和IC&#xff08;集成电路&#xff09;开发这一技术密集型行业中&#xff0c;DeepSeek凭借其…

(一)DeepSeek大模型安装部署-Ollama安装

大模型deepseek安装部署 (一)、安装ollama curl -fsSL https://ollama.com/install.sh | sh sudo systemctl start ollama sudo systemctl enable ollama sudo systemctl status ollama(二)、安装ollama遇到网络问题&#xff0c;请手动下载 ollama-linux-amd64.tgz curl -L …

基于Flask的汽车质量投诉可视化分析系统的设计与实现

【FLask】基于Flask的汽车质量投诉可视化分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 随着汽车市场的不断扩大和消费者维权意识的增强&#xff0c;汽车质量投诉问题日益…

计算机网络 应用层 笔记1(C/S模型,P2P模型,FTP协议)

应用层概述&#xff1a; 功能&#xff1a; 常见协议 应用层与其他层的关系 网络应用模型 C/S模型&#xff1a; 优点 缺点 P2P模型&#xff1a; 优点 缺点 DNS系统&#xff1a; 基本功能 系统架构 域名空间&#xff1a; DNS 服务器 根服务器&#xff1a; 顶级域…

Android studio 创建aar包给Unity使用

1、aar 是什么&#xff1f; 和 Jar有什么区别 aar 和 jar包 都是压缩包&#xff0c;可以使用压缩软件打开 jar包 用于封装 Java 类及其相关资源 aar 文件是专门为 Android 平台设计的 &#xff0c;可以包含Android的专有内容&#xff0c;比如AndroidManifest.xml 文件 &#…

MySQL--loaddata infile、outfile into及mysqldump高效导入导出数据_mysql load outfile

【学习背景】 在日常工作和学习MySQL时&#xff0c;经常涉及到MySQL数据的导入和导出&#xff0c;分享几种常用又方便的方式&#xff1a; &#xff08;1&#xff09;MySQL命令行source命令 &#xff08;3&#xff09;语法into outfile和load data infile &#xff08;3&#xf…

基于LMStudio本地部署DeepSeek R1

DeepSeek R1 DeepSeek R1是由DeepSeek团队开发的一款高性能AI推理模型&#xff0c;其开源版本包括完整的DeepSeek R1 671B权重&#xff0c;以及基于其蒸馏出的多个小型模型。 DeepSeek R1通过蒸馏技术将推理模式迁移到更小的模型中&#xff0c;显著提升了这些模型的推理能力。…

#渗透测试#批量漏洞挖掘#Splunk Enterprise for Windows 任意文件读取漏洞( CVE-2024-36991)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

读书笔记--分布式架构的异步化和缓存技术原理及应用场景

本篇是在上一篇的基础上&#xff0c;主要对分布式应用架构下的异步化机制和缓存技术进行学习&#xff0c;主要记录和思考如下&#xff0c;供大家学习参考。大家知道原来传统的单一WAR应用中&#xff0c;由于所有数据都在同一个数据库中&#xff0c;因此事务问题一般借助数据库事…

【提示词工程】探索大语言模型的参数设置:优化提示词交互的技巧

在与大语言模型(Large Language Model, LLM)进行交互时,提示词的设计和参数设置直接影响生成内容的质量和效果。无论是通过 API 调用还是直接使用模型,掌握模型的参数配置方法都至关重要。本文将为您详细解析常见的参数设置及其应用场景,帮助您更高效地利用大语言模型。 …

(七)QT——消息事件机制&绘图&文件

目录 前言 消息事件机制 (Event System) 绘图 (Graphics & Drawing) 绘图设备 Qt 提供的主要绘图设备 Qt 主要绘图设备的特点 各个绘图设备的详细介绍 文件处理 (File Handling) 总结 前言 QT 是一个非常强大的图形用户界面&#xff08;GUI&#xff09;开发框架&…

ChatGPT提问技巧:行业热门应用提示词案例-文案写作

ChatGPT 作为强大的 AI 语言模型&#xff0c;已经成为文案写作的得力助手。但要让它写出真正符合你需求的文案&#xff0c;关键在于如何与它“沟通”&#xff0c;也就是如何设计提示词&#xff08;Prompt&#xff09;。以下是一些实用的提示词案例&#xff0c;帮助你解锁 ChatG…

C++服务端开发注意事项总结

文章目录 一、架构设计1. 选择合适的网络框架2. 确定并发模型3. 模块化设计 二、性能优化1. 优化内存管理2. 减少锁的使用3. 优化网络通信 三、安全性1. 输入验证2. 使用安全的通信协议3. 防止拒绝服务攻击&#xff08;DoS&#xff09; 四、可维护性1. 日志记录2. 代码注释3. 单…

idea中git的简单使用

提交&#xff0c;推送直接合并 合到哪个分支就到先切到哪个分支

Kubernetes 中 BGP 与二层网络的较量:究竟孰轻孰重?

如果你曾搭建过Kubernetes集群,就会知道网络配置是一个很容易让人深陷其中的领域。在负载均衡器、服务通告和IP管理之间,你要同时应对许多变动的因素。对于许多配置而言,使用二层(L2)网络就完全能满足需求。但边界网关协议(BGP)—— 支撑互联网运行的技术 —— 也逐渐出…