redis--lua实现漏桶算法限流

纯粹无聊写的,没啥大用,本来是想保证原子性,但是写完发现虽然内部逻辑保证了但是,调用时还是会无法保证原子性,实际完全可以写在java里然后加个分布式锁优雅解决,不过既然写了直接删了太可惜了,存起来纪念下吧 

  String lua =
                "local lastTimekey=KEYS[1]\n" +
                        "local speedkey=ARGV[1]\n" +
                        //获取该渠道桶的初始参数
                        "local lastTimevalue=redis.call('get',lastTimekey)\n" +
                        "local speedvalue=redis.call('get',lastTimekey)\n" +
                        //兼容第一次注水的情况
                        "if(lastTimevalue) then\n" +
                        "else\n" +
                        "   lastTimevalue=0\n" +
                        "end\n" +
                        //计算允许注水的数量
                        "local allowNum=(ARGV[2]-lastTimevalue)/1000*speedvalue\n" +
                        //判断允许数量是否大于当前需要注水的数量
                        "if(allowNum>tonumber(ARGV[3])) then\n" +
                        "   redis.call('set',lastTimekey,tonumber(ARGV[2]))" +
                        "   return 'true'" +
                        "else\n" +
                        "   return 'false'\n" +
                        "end\n" +
                        "return 'false'";
        String res = RedisFactory.defaultClient()
                .eval(lua, 1, "testlastTime", "testspeed", new Date().getTime() + "", "20").toString();

 

你可能感兴趣的:(redis)