• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

SpringBoot使用Lua脚本操作Redis

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

最近需要对一个接口基于用户进行限流,简单粗暴的固定窗口限流,10s内只允许调3次

一种是直接在JAVA中做逻辑判断

另一种是 通过lua脚本进行实现,故对lua脚本小试牛刀

 

1. 在JAVA里直接实现

 

2.通过lua脚本实现

编写lua脚本,把lua脚本放在resources目录下。

add_fav_limit_rate.lua

local times = redis.call('incr',KEYS[1])
if times == 1 then
    redis.call('expire',KEYS[1], tonumber(ARGV[1]))
end
if times > tonumber(ARGV[2]) then
    return 0
end
return 1

  

JAVA实现代码

    // {"limitTime": 10,"limitUnit": "SECONDS","limitCnt": 3}
    String rule = PropertyConfigurer.getNSString("application", "limit.addFav.rule");
    JSONObject jsonObject = JSONObject.parseObject(rule);
    Integer limitTime = jsonObject.getInteger("limitTime");
    Integer limitCnt = jsonObject.getInteger("limitCnt");

    RedisTemplate redisTemplate =
        RedisTemplateUtil.getRedisTemplateByResourceName(
            RedisConstants.ORCHESTRATOR_SERVICE_RESOURCE);

    String redisKey = RedisConstants.LIMIT_ADDFAV_KEY_PREFIX + userId;

    DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>();
    redisScript.setResultType(Boolean.class);
    redisScript.setScriptSource(
        new ResourceScriptSource(new ClassPathResource("script/add_fav_limit_rate.lua")));
    List<String> keys = Lists.newArrayList(redisKey);

    Boolean result = (Boolean) redisTemplate.execute(redisScript, keys, limitTime, limitCnt);
    return result;

  


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
idea进行lua开发及运行nginx-lua程序发布时间:2022-07-22
下一篇:
15分钟入门lua发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap