【golang】分布式限流器 redis lua + go 实现

news/2024/3/29 19:33:09/文章来源:https://blog.csdn.net/qfzhangwei/article/details/127259104

1 事务实现:

  • 缺点1:非常明显,开启事务后,每个命令都是需要和服务器端多次网络交互,非常浪费;
  • 缺点2:不满足原子性,需要Watch加锁机制一起使用,维护复杂
  • 缺点3:后执行的命令无法依赖先执行的命令结果,需要Watch加锁机制一起使用,维护复杂
// 开启事务
MULTI
// 删除过期数据
ZREMRANGEBYSCORE <path> 0 <windowStartTimestamp>
// 统计访问次数
ZCARD <path>
// 添加当前时间戳
ZADD <path> <currentTimestamp> <currentTimestamp>
// 设置过期时间
EXPIRE <path> <windowSize>
// 执行事务
EXEC

2 lua脚本实现  注意score精度是52位有效;ns存储可以忽略这个精度?

rdb := redis.NewClient(...)
now := time.Now().UnixNano()
windowSize := int64(time.Second) // 1000000000 NanoSeconds
rateLimit := 1000 // can get from config
luaScript := `local path = KEYS[1]local now = tonumber(ARGV[1])local window = tonumber(ARGV[2])local limit = tonumber(ARGV[3])local clearBefore = now - windowredis.call('ZREMRANGEBYSCORE', path, 0, clearBefore)local amount = redis.call('ZCARD', path)if amount < limit thenredis.call('ZADD', path, now, now)endredis.call('EXPIRE', path, window)return limit - amount
`
vals, err := rdb.Eval(luaScript,            // script1,                    // number of keys[]string{path},       // KEYSnow,                  // ARGV[1]windowSize,           // ARGV[2]rateLimit,            // ARGV[3]
).Result()

3. lua脚本单独存储

filename := "/some/path/ratelimiter.lua"
content, err := ioutil.ReadFile(filename)
if err != nil {// handle errorlog.Errorf(err, "Could not read file %s", filename)
}
luaScript := string(content)
vals, err := rdb.Eval(luaScript,            // script1,                    // number of keys[]string{path},       // KEYSnow,                  // ARGV[1]windowSize,           // ARGV[2]rateLimit,            // ARGV[3]
).Result()

参考:

Redis: Pipelining, Transactions and Lua Scripts
What is a Rate Limiting Algorithm and How to Build One | Kong Inc.
Redis: Pipelining, Transactions and Lua Scripts
ZADD | Redis
ZCARD | Redis
ZCOUNT | Redis
Building a sliding window rate limiter with Redis — Clarabridge Engage Dev Blog
Error: Internal Rate Limit Reached — Clarabridge Engage Dev Blog
Flowchart Maker & Online Diagram Software
https://medium.com/@saisandeepmopuri/system-design-rate-limiter-and-data-modelling-9304b0d18250
An alternative approach to rate limiting
https://gist.github.com/ptarjan/e38f45f2dfe601419ca3af937fff574d
Scaling your API with rate limiters
GitHub - go-redis/redis: Type-safe Redis client for Golang
redis-geo.lua-golang/redis-geo-lua-example.go at master · abhirockzz/redis-geo.lua-golang · GitHub

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

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

相关文章

线程池详解与异步任务编排使用案例

线程池详解与异步任务编排使用案例 1.初始化线程的4种方式 1&#xff09;、继承Thread 2&#xff09;、实现 Runnable接口 3&#xff09;、实现 Callable接口FutureTask&#xff08;可以拿到返回结果&#xff0c;可以处理异常&#xff09; 4&#xff09;、线程池区别&#xf…

b站pink老师JavaScript的jQuery 案例代码——电梯导航案例

目录 代码部分&#xff1a; 1.index.js&#xff08;全是重点&#xff09; 2.index.html&#xff08;辅助作用&#xff0c;用于查看结构&#xff09; 3.index.css&#xff08;辅助作用&#xff0c;用于设置一开始的电梯导航display:none&#xff09; 4.jquery.min.js&#x…

Graph Representation Learning Chapter[3]

本章学习节点嵌入。这些方法的目标是将节点编码为低维向量&#xff0c;以表示它们的图位置和局部图邻域的结构。换句话说&#xff0c;我们希望将节点投影到一个潜在空间中&#xff0c;其中这个潜在空间中的几何关系对应于原始图或网络中的关系。 几篇文章&#xff0c;强烈建议观…

行为树BT设计与实现

行为树BT设计与实现1 介绍2 汇总From McYY整体结构运行逻辑节点共享数据中断的实现From AKaraFrom Luyu HuangFrom 阿高From xiyoo0812参考1 介绍 状态机与行为树BT 2 汇总 From McYY lua行为树设计与实现 LuaBT 项目需要&#xff0c;之前行为树用的是behaviorDesigner&…

数据科学的统计学知识笔记

1.描述统计 1.数字特征&#xff08;描述统计&#xff09; 集中趋势 众数中位数四分位数平均数&#xff1a;样本平均数&#xff08;xˉ\bar{x}xˉ&#xff09;与总体平均数&#xff08;μ\muμ&#xff09; 离中趋势&#xff08;离散趋势&#xff09;异众比率&#xff1a;非众…

scratch加法出题器 电子学会图形化编程scratch等级考试三级真题和答案解析2022年9月

目录 scratch加法出题器 一、题目要求 1、准备工作 2、功能实现 二、案例分析 <

『LeetCode|每日一题』---->二叉搜索树中第K小的元素

目录 1.每日一句 2.作者简介 3.二叉搜索树简介 『LeetCode|每日一题』二叉搜索树中第K小的元素 1.每日一题 4.解题思路 4.1 思路分析 4.2 核心代码 4.3 完整代码 4.4 运行结果 1.每日一句 因为时间永远分岔&#xff0c;通往无数的未来 2.作者简介 &#x1f3e1;个人主页&…

如何着手写一篇医学综述?

各位医学研究生&#xff0c;研0的时候是不是导师都已经把综述布置下来作为你的第一份作业呀&#xff1f;对于医学生们来说&#xff0c;不管你是本科就已经开始接触科研还是研究生开始才接触科研&#xff0c;反正在你开始阅读文献的时候开始一篇综述总是逃不过的。鉴于有综述任务…

Sql Server CDC配置

概述 CDC&#xff08;Change Data Capture&#xff09;&#xff0c;即数据变更抓取&#xff0c;通过为源端数据源开启CDC&#xff0c;ROMA Connect可实现数据源的实时数据同步以及数据表的物理删除同步。 本章节主要介绍如何为SQL Server数据库开启CDC功能。 前提条件 SQL S…

算力是新一代的“石油”,我们该如何利用好它?

我们处在一个数字世界&#xff0c;计算能力成为科技进步和经济发展的底座&#xff0c;也正在改变我们的生产方式和生活方式。未来&#xff0c;几万台、几十万台甚至几亿台服务器&#xff0c;如果都能够基于一个操作系统进实时调度&#xff0c;将带来巨大的算力提升。我们这一代…

【Linux高效小trick】快速查看Linux进程的开始和运行时间

写在前面 前面介绍了&#xff0c;怎么杀死Linux的僵尸进程&#xff0c;为GPU释放更多的内存&#xff0c;做想做的事&#xff0c;文章链接如下&#xff1a; 【Linux高效小trick】Linux下杀死僵尸进程&#xff0c;释放GPU内存&#xff0c;让代码全速运行~ 今天再来具体说下&…

Jetpack 之 ViewModel

Jetpack 系列第三篇&#xff0c;这次回顾 ViewModel&#xff0c;ViewModel 作为 MVVM 架构中的 VM 层&#xff0c;具有自己的生命周期&#xff0c;且生命周期贯穿整个 Activity 或 Fragment&#xff0c;相较于之前 MVP 的 Presenter&#xff0c;它的存活时间更长&#xff0c;所…

商用图片素材,高清无水印

今天给大家分享8个免费、商用图片素材网站&#xff0c;全部高清无水印&#xff0c;轻松应对各种场景。1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYwNDUx菜鸟图库是一个综合性素材网站&#xff0c;这里面有很多设计、图片、视频、音频等素材&#xff0c;图片素材全部都…

vscode 提示 vetur can‘t find `tsconfig.json`的解决办法

VSCode&#xff08;全称&#xff1a;Visual Studio Code&#xff09;是一款由微软开发且跨平台的免费源代码编辑器。该软件支持语法高亮、代码自动补全&#xff08;又称 IntelliSense&#xff09;、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和 Git 版本控制系统…

SEO作弊有哪些手段,网站采用SEO作弊会带来哪些惩罚

在做网站SEO优化过程中&#xff0c;有的人为了快速提高网站排名&#xff0c;采用了各种各样的方法。有的甚至采用SEO作弊的手段来优化网站&#xff0c;短期内提升了网站的排名。但是&#xff0c;我们要知道&#xff0c;做SEO优化欲速则不达&#xff0c;SEO作弊会给网站带来一定…

部署CentOS可视化界面GUI-之腾讯云服务器

目录 一、购买云服务器实例 二、配置安全组、设置管理员密码 三、远程登录 四、安装CentOS可视化界面GUI 4.1、系统GUI配置 4.2、系统GUI配置 一、购买云服务器实例 二、配置安全组、设置管理员密码 三、远程登录 用其控制台下webShell&#xff0c;或VNC模式&#xff0…

《MySQL实战45讲》——学习笔记08 “一致性视图、可重复读实现“

这篇文章讲的比较分散&#xff0c;这里做一个梳理&#xff0c;先将简单的概念如"事务的启动时机"、"视图"、"秒级创建快照"拎出来解释&#xff0c;然后通过文章中的几个例子说明"一致性读"和"当前读"&#xff1b; 08 | …

AspectJ in action

Discovering AOP This chapter covers ■ Understanding crosscutting concerns ■ Modularizing crosscutting concerns using AOP ■ Understanding AOP languages Reflect back on your last project, and compare it with a project you worked on a few years back. Wha…

一文带你快速鉴别CookieSession

文章目录会话跟踪技术1、相关基础概念2、Cookie2.1 Cookie的基本使用2.1.1 发送Cookie2.1.2 获取Cookie2.2 Cookie原理2.3 Cookie存活时间2.4 Cookie存储中文3、Session3.1 Session的基本使用3.2 Session原理3.3 Session的钝化和活化3.4 Session的存活时间总结会话跟踪技术 1、…

SSl证书协议作用

SSl证书协议作用 随着移动互联网时代的飞速发展&#xff0c;似乎每周都能看到很多关于数据泄露的新闻&#xff0c;而且报道还在不断涌现。在统计的100款app中&#xff0c;有多达91款app收集了过多的用户个人信息。 为了改善这一现象&#xff0c;网络空间管理局联合发布了《认定…