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脚本保证原子性
  • 参数使用字符串生效
posted @   码农记事本  阅读(297)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示