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;
    

      

  • 相关阅读:
    Redis笔记 —— string 篇
    解决跨域请求无法携带Cookie的问题
    Mysql事务学习笔记
    Redis笔记 —— hash 篇
    mysql视图的简单学习
    axios无法被识别为ajax请求的解决方案
    常见header信息详解
    int 15h
    操作系统有进程了
    是时候走我自己的路线了,真正的做我自己的Jinux
  • 原文地址:https://www.cnblogs.com/shoshana-kong/p/15014210.html
Copyright © 2011-2022 走看看