基于Redis的token限流实现
造轮子的过程也是学习的过程。
如果公司的 Redis 不支持发布订阅指令的话,是没法用 Redisson 的,因为 Redisson 的大部分功能都依赖于 Redis 的发布订阅指令。
这是完整实现的代码仓库:https://gitee.com/wu0916/redis-rate-limiter
下面这段 lua 代码是基于 Redis 的 RateLimiter 的实现:
local max=tonumber(ARGV[1]) -- 单位时间内的最大令牌数
local interval=tonumber(ARGV[2]) -- 生成一个令牌的间隔毫秒数
local align=tonumber(ARGV[3]) -- 当前时间戳(对齐之后的时间戳)
align=align-(align%interval) -- 对齐当前时间戳
local latest=redis.call('HGET',KEYS[1],'latest') -- 获取最后一次成功获取令牌的时间戳
if latest then
local remain=tonumber(redis.call('HGET',KEYS[1],'remain'))
local diff=align-tonumber(latest)
if diff>1000 then
remain=1
elseif diff>=interval then
remain=math.min((math.floor(diff/interval)+remain),max)
end
if remain<=0 then
return 0
else
redis.call('HSET',KEYS[1],'remain',remain-1,'latest',align)
return 1
end
else -- 如果首次获取,直接返回成功,并设置时间为对齐时间
redis.call('HSET',KEYS[1],'remain',0,'latest',align)
return 1
end
有任何问题欢迎提出。
------------------------------我是博客签名------------------------------
座右铭:不要因为知识简单就忽略,不积跬步无以至千里。
版权声明:自由转载-非商用-非衍生-保持署名。
本作品采用知识共享署名 4.0 国际许可协议进行许可。
----------------------------------------------------------------------
座右铭:不要因为知识简单就忽略,不积跬步无以至千里。
版权声明:自由转载-非商用-非衍生-保持署名。
本作品采用知识共享署名 4.0 国际许可协议进行许可。
----------------------------------------------------------------------
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么 .NET8线程池 容易引发线程饥饿
· 场景题:假设有40亿QQ号,但只有1G内存,如何实现去重?
· 在 .NET 中使用 Tesseract 识别图片文字
· Bolt.new 30秒做了一个网站,还能自动部署,难道要吊打 Cursor?
· C#/.NET/.NET Core技术前沿周刊 | 第 20 期(2025年1.1-1.5)
2018-09-06 ArrayList源码分析