redis+lua实现分布式限流

利用redis + lua 原子性的特性,实现分布式限流,代码如下

 /**
     *  KEYS[1] 锁定的key
     *  ARGV[1]  失效时间
     *  ARGV[2]  判断的数字
     *  redis 自增, 失效时间过期后,自增也就失效
     *  ,利用这个特性可以做分布式限流
     */
   String redisLua = "local num = redis.call('incr', KEYS[1])\n" +
            "if tonumber(num) == 1 then\n" +
            "\tredis.call('expire', KEYS[1], ARGV[1])\n" +
            "\treturn 1\n" +
            "elseif tonumber(num) > tonumber(ARGV[2]) then\n" +
            "\treturn 0\n" +
            "else \n" +
            "\treturn 1\n" +
            "end\n";
  /**
     *  失效时间
     *  判断的数字
     */
  List<String> argList = Arrays.asList("5", "1");
    //要获取的key值
  List<String> keys = new ArrayList<>();
  keys.add("testKey");
  Jedis jedis = new Jedis();
  String scriptLoad = jedis.scriptLoad(script);
  Long dataResult = (Long)jedis.evalsha(scriptLoad,keysList,argList);
  // 结果为 1 则通过,为0则不通过
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值