Code Monkey home page Code Monkey logo

syj-ratelimit's People

Contributors

misszhaoyan avatar shiyujun avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

syj-ratelimit's Issues

计算令牌数取整

计算令牌数的时候需要取整,否则lua脚本里面的数值计算都是浮点计算,会导致令牌数出现小数,从而redis执行减一的时候报错。
需要修改的代码行
local maxValue = value+diff/intervalstep;
修改为:
local maxValue = math.floor(value+diff/interval
step);
会报错的代码行
redis.call('DECR',key);

redis适用于集群部署

生产环境的redis一般为集群部署的,建议修改为可适用于集群部署。
当集群部署的时候lua脚本参数的所有key和脚本里面的key需要具有相同的slot,以使所有命令都分发到同一个redis服务器上以保证原子性,否则会导致限流失败。

开源登记

如果有将syj-ratelimit用于生产环境的朋友们,请在此留下足迹(项目名or公司名),便于宣传。谢谢啦!

令牌通算法脚本的BUG

if  diff > interval 

经过测试发现,在令牌通算法并发情况下,接口耗时1秒,并发20,设置令牌刷新时间1秒,令牌数量20,如果第一秒花光令牌,那么第二秒的时候请求过来diff应该是1,但是interval也是1,所以在这一秒中,所有的请求都无法拿到令牌

关于lua脚本的疑问

local key = KEYS[1];
local limit = tonumber(string.sub(KEYS[2],1,string.len(KEYS[2])-5));
local step = tonumber(string.sub(KEYS[3],1,string.len(KEYS[3])-5));
local interval = tonumber(string.sub(KEYS[4],1,string.len(KEYS[4])-5));
local nowTime=tonumber(string.sub(KEYS[5],1,string.len(KEYS[5])-5));

local lastClearTimeKey='syj-rateLimiter-lastClearTime'..key
local lastClearTime=redis.call('GET',lastClearTimeKey);
local hasKey = redis.call('EXISTS',key);

代码中KEYS[2]到KEYS[5]应作为ARGV传递,无需设置hashTag. 而key和lastClearTimeKey是两个key,应该设置同一个hashTag(猜测,条件限制未测试).求大佬解惑

令牌桶算法问题

2018-10-23 22:09:49.105  INFO 4776 --- [nio-8080-exec-5] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:09:49.196  INFO 4776 --- [nio-8080-exec-7] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:09:49.289  INFO 4776 --- [nio-8080-exec-9] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:09:49.379  INFO 4776 --- [nio-8080-exec-1] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:09:49.472  INFO 4776 --- [nio-8080-exec-2] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:09:49.562  INFO 4776 --- [nio-8080-exec-5] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:09:49.653  INFO 4776 --- [nio-8080-exec-7] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:09:49.745  INFO 4776 --- [nio-8080-exec-9] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:09:49.834  INFO 4776 --- [nio-8080-exec-1] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:09:49.925  INFO 4776 --- [nio-8080-exec-2] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:09:50.015  INFO 4776 --- [nio-8080-exec-5] c.a.b.r.d.controller.LimiterController   : token-bucket result=-1
2018-10-23 22:09:56.453  INFO 4776 --- [nio-8080-exec-7] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:09:56.543  INFO 4776 --- [nio-8080-exec-9] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:09:56.638  INFO 4776 --- [nio-8080-exec-1] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:09:56.727  INFO 4776 --- [nio-8080-exec-2] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:09:56.816  INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:09:56.909  INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:09:56.999  INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:09:57.091  INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController   : token-bucket result=-1
2018-10-23 22:09:57.184  INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController   : token-bucket result=-1
2018-10-23 22:09:57.278  INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController   : token-bucket result=-1
2018-10-23 22:09:57.363  INFO 4776 --- [nio-8080-exec-5] c.a.b.r.d.controller.LimiterController   : token-bucket result=-1
2018-10-23 22:10:02.827  INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:10:02.921  INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:10:03.008  INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:10:03.103  INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:10:03.191  INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:10:03.288  INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:10:03.377  INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController   : token-bucket result=-1
2018-10-23 22:10:03.471  INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController   : token-bucket result=-1
2018-10-23 22:10:03.557  INFO 4776 --- [nio-8080-exec-1] c.a.b.r.d.controller.LimiterController   : token-bucket result=-1
2018-10-23 22:10:03.649  INFO 4776 --- [nio-8080-exec-2] c.a.b.r.d.controller.LimiterController   : token-bucket result=-1
2018-10-23 22:10:03.737  INFO 4776 --- [nio-8080-exec-5] c.a.b.r.d.controller.LimiterController   : token-bucket result=-1
2018-10-23 22:11:21.022  INFO 4776 --- [nio-8080-exec-7] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:21.113  INFO 4776 --- [nio-8080-exec-9] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:21.204  INFO 4776 --- [nio-8080-exec-1] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:21.296  INFO 4776 --- [nio-8080-exec-2] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:21.386  INFO 4776 --- [nio-8080-exec-5] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:21.475  INFO 4776 --- [nio-8080-exec-7] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:21.569  INFO 4776 --- [nio-8080-exec-9] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:21.656  INFO 4776 --- [nio-8080-exec-1] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:21.752  INFO 4776 --- [nio-8080-exec-2] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:21.839  INFO 4776 --- [nio-8080-exec-5] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:21.934  INFO 4776 --- [nio-8080-exec-7] c.a.b.r.d.controller.LimiterController   : token-bucket result=-1
2018-10-23 22:11:39.641  INFO 4776 --- [nio-8080-exec-9] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:39.733  INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:39.825  INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:39.921  INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:40.013  INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:40.099  INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:40.190  INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:40.279  INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:40.372  INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:40.465  INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:40.555  INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController   : token-bucket result=-1
2018-10-23 22:11:51.639  INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:51.728  INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:51.824  INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:51.911  INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:52.005  INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:52.096  INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:52.188  INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:52.280  INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:52.374  INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:52.459  INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:52.554  INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController   : token-bucket result=-1
2018-10-23 22:11:58.030  INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:58.121  INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:58.213  INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:58.304  INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:58.394  INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:58.488  INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:58.580  INFO 4776 --- [nio-8080-exec-3] c.a.b.r.d.controller.LimiterController   : token-bucket result=1
2018-10-23 22:11:58.671  INFO 4776 --- [nio-8080-exec-6] c.a.b.r.d.controller.LimiterController   : token-bucket result=-1
2018-10-23 22:11:58.762  INFO 4776 --- [nio-8080-exec-8] c.a.b.r.d.controller.LimiterController   : token-bucket result=-1
2018-10-23 22:11:58.854  INFO 4776 --- [io-8080-exec-10] c.a.b.r.d.controller.LimiterController   : token-bucket result=-1
2018-10-23 22:11:58.941  INFO 4776 --- [nio-8080-exec-4] c.a.b.r.d.controller.LimiterController   : token-bucket result=-1

11个线程跑的,最后一次跑的有些不对,
单位时间是s,会不会有误差

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.