springboot使用redis实现计数限流
lua脚本
resources 下创建文件 redis/AccessLimit.lua
内容为:
local limitSecond = tonumber(ARGV[1]) local limitMaxCount = tonumber(ARGV[2]) local num = tonumber(redis.call('get', KEYS[1]) or '-1') if num == -1 then redis.call('incr', KEYS[1]) redis.call('expire', KEYS[1], limitSecond) return 1 else if num >= limitMaxCount then return 0 else redis.call('incr', KEYS[1]) return 1 end end
API测试
@RestController public class TestController { @Autowired private StringRedisTemplate stringRedisTemplate; @RequestMapping("test") public String test() { DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>(); redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("redis/AccessLimit.lua"))); redisScript.setResultType(Long.class); Long result = stringRedisTemplate.execute(redisScript, Arrays.asList("user1"), "5", "10"); return result+""; } }
注意事项
- 必须使用lua脚本保证原子性
- 参数使用字符串生效
分类:
java笔记
标签:
redis
, springboot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下