zoukankan      html  css  js  c++  java
  • SpringBoot使用Lua脚本操作Redis

    最近需要对一个接口基于用户进行限流,简单粗暴的固定窗口限流,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;
    

      

  • 相关阅读:
    编译错误error:&nbsp;invalid&amp;nbsp…
    移植OK6410&#039;S&nbsp;dm9000ae…
    JavaScript 正则表达式-严格匹配
    JavaScript indexOf() 方法
    JavaScript splice() 方法
    Css文字效果
    知识点-语句
    知识点—变量、运算符(表达式)
    WPF RichTextBox相关总结
    WPF调用图片路径,或资源图片
  • 原文地址:https://www.cnblogs.com/shoshana-kong/p/15014210.html
Copyright © 2011-2022 走看看