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;
    

      

  • 相关阅读:
    .net core 3.0中可以使用gRPC了
    Java clone() 浅克隆与深度克隆(转)
    CENTOS下搭建SVN服务器(转)
    设置eclipse不同的workspace共享配置
    在Eclipse添加Android兼容包( v4、v7 appcompat )(转)
    【原创】Nginx+PHP-FPM优化技巧总结(转)
    【汇总】PHP-FPM 配置优化(转)
    nginx File not found 错误(转)
    nginx php-fpm安装配置(转)
    nginx优化(转)
  • 原文地址:https://www.cnblogs.com/shoshana-kong/p/15014210.html
Copyright © 2011-2022 走看看