## 分布式限流实现案例 ##
### 技术栈
* Java
* Redis
* Lua
### 测试脚本
[LimiterOperationTest](com.github.bakerzhu.LimiterOperationTest)
### 核心Lua脚本
```lua
--- 判断source_str 中是否contains sub_str
--- @param source_str
--- @param sub_str
local function contains(source_str , sub_str)
local start_pos,end_pos = string.find(source_str,sub_str);
if start_pos == nil then
return false
end
local source_str_len = string.len(source_str)
local s = string.sub(source_str,end_pos,end_pos)
if source_str_len == end_pos then
return true;
elseif string.sub(source_str,end_pos + 1,end_pos + 1) == "," then
return true;
end
return false;
end
--- 获取令牌
--- 返回码
--- 0 没有令牌桶配置
--- -1 表示取令牌失败,也就是桶里没有令牌
--- 1 表示取令牌成功
--- @param key 令牌的唯一标识
--- @param permits 请求令牌数量
--- @param curr_mill_second 当前毫秒数
--- @param context 使用令牌的应用标识
local function acquire(key , permits , curr_mill_second , context)
local rate_limit_info = redis.pcall("HMGET" , key , "last_mill_second","curr_permits","max_permits","rate","apps")
local last_mill_second = rate_limit_info[1]
local curr_permits = tonumber(rate_limit_info[2])
local max_permits = tonumber(rate_limit_info[3])
local rate = rate_limit_info[4]
local apps = rate_limit_info[5]
-- 标识没有配置令牌桶
if type(apps) == 'boolean' or apps == nil or not contains(apps , context) then
return 0
end
local local_curr_permits = curr_permits
--- 令牌桶刚刚创建,上一次获取令牌的毫秒数为空
--- 根据和上一次向桶里添加令牌的时间和当前时间差,触发式往桶里添加令牌,并且更新上一次向桶里添加令牌的时间
--- 如果向桶里添加的令牌数不足一个,则不更新上一次向桶里添加令牌的时间
if (type(last_mill_second) ~= 'boolean' and last_mill_second ~= nil) then
local reverse_permits = math.floor(((curr_mill_second - last_mill_second)/1000) * rate)
local expect_curr_permits = reverse_permits + curr_permits;
local_curr_permits = math.min(expect_curr_permits,max_permits)
--- 大于0表示不是第一次获取令牌,也没有向桶里添加令牌
if (reverse_permits > 0) then
redis.pcall("HSET",key, "last_mill_second" , curr_mill_second)
end
else
redis.pcall("HSET" , key, "last_mill_second" , curr_mill_second)
end
local result = -1
if (local_curr_permits - permits >=0) then
result = 1
redis.pcall("HSET" , key , "curr_permits" , local_curr_permits - permits)
else
redis.pcall("HSET" , key , "curr_permits" , local_curr_permits)
end
return result
end
--- 初始化令牌桶配置
--- @param key 令牌的唯一标识
--- @param max_permits 桶大小
--- @param rate 向桶里添加令牌的速率
--- @param apps 可以使用令牌桶的应用列表,应用之前用逗号分隔
local function init(key, max_permits, rate , apps)
local rate_limit_info = redis.pcall("HMGET",key,"last_mill_second","curr_permits","max_permits","rate","apps")
local org_max_permits = tonumber(rate_limit_info[3])
local org_rate = rate_limit_info[4]
local org_apps = rate_limit_info[5]
if (org_max_permits == nil) or (apps ~= org_apps or rate ~= org_rate or max_permits ~= org_max_permits) then
redis.pcall("HMSET", key , "max_permits" , max_permits , "rate" , rate , "curr_permits" , max_permits , "apps" , apps)
end
return 1
end
--- 删除令牌桶
local function delete(key)
redis.pcall("DEL",key)
return 1
end
local key = KEYS[1]
local method = ARGV[1]
if method == 'acquire' then
return acquire(key,KEYS[2],KEYS[3],KEYS[4])
elseif method == 'init' then
return init(key,KEYS[2],KEYS[3],KEYS[4])
elseif method == 'delete' then
return delete(key)
end
```
没有合适的资源?快使用搜索试试~ 我知道了~
企业级 分布式 限流 方案.zip
共18个文件
java:12个
lua:2个
xml:1个
需积分: 3 0 下载量 104 浏览量
2024-01-15
10:48:17
上传
评论
收藏 15KB ZIP 举报
温馨提示
方案是为解决特定问题或达成特定目标而制定的一系列计划或步骤。它的作用是提供一种系统性的方法,以有效地应对挑战、优化流程或实现目标。以下是方案的主要作用: 问题解决: 方案的核心目标是解决问题。通过系统性的规划和执行,方案能够分析问题的根本原因,提供可行的解决方案,并引导实施过程,确保问题得到合理解决。 目标达成: 方案通常与明确的目标相关联,它提供了一种达成这些目标的计划。无论是企业战略、项目管理还是个人发展,方案的制定都有助于明确目标并提供达成目标的路径。 资源优化: 方案在设计时考虑了可用资源,以最大化其效用。通过明智的资源分配,方案可以在有限的资源条件下实现最大的效益,提高效率并减少浪费。 风险管理: 方案通常会对潜在的风险进行评估,并制定相应的风险管理策略。这有助于减轻潜在问题的影响,提高方案的可行性和可持续性。 决策支持: 方案提供了决策者所需的信息和数据,以便做出明智的决策。这种数据驱动的方法有助于减少不确定性,提高决策的准确性。 团队协作: 复杂的问题通常需要多个人的协同努力。方案提供了一个共同的框架,帮助团队成员理解各自的职责和任务,促进协作并确保整个团队朝着共同的目标努力。 监控与评估: 方案通常包括监控和评估的机制,以确保实施的有效性。通过定期的评估,可以及时调整方案,以适应变化的环境或新的挑战。 总体而言,方案的作用在于提供一种有序、有计划的方法,以解决问题、实现目标,并在实施过程中最大化资源利用和风险管理。
资源推荐
资源详情
资源评论
收起资源包目录
企业级 分布式 限流 方案.zip (18个子文件)
SJT-code
pom.xml 5KB
src
test
resources
lua
rate_limiter.lua 4KB
java
com
github
bakerzhu
AppTest.java 291B
LimiterOperationTest.java 1KB
main
resources
redis-config.properties 227B
lua
rate_limiter.lua 4KB
java
com
github
bakerzhu
limiter
LimiterOperation.java 3KB
utils
FileUtils.java 2KB
base
LimiterInitBean.java 1KB
JedisPoolConfig.java 2KB
JedisPoolFactory.java 4KB
Token.java 798B
App.java 182B
inter
AbstractConfig.java 2KB
constants
RateLimiterConstants.java 462B
JedisConfigConstants.java 723B
.gitignore 132B
README.md 4KB
共 18 条
- 1
资源评论
JJJ69
- 粉丝: 6222
- 资源: 5780
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于mysql和python的学生选课系统【课程设计(实验报告+源码)】
- PxCook-像素大厨Windows版本安装包
- aspose-words-23.12-jdk16 有水印
- [大模型部署]在C# Winform中使用文心一言ERNIE-3.5 4K 聊天模型
- python毕业设计-基于Django+OpenCV的二维码生成与识别系统设计与实现.zip
- python毕业设计-基于Django+OpenCV的二维码生成与识别系统设计与实现+使用说明.zip
- 基于STM32单片机空气监测系统设计源码+详细文档+配套全部资料(毕业设计).zip
- rdf0412-kcu116-pcie-c-2019-1.zip(XILINX KCU116 源码)
- 基于C#语言的winform界面火车票订票系统(源码+实验报告)
- 【华为OD部分真题及讲解】华为OD部分真题及讲解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功