视频里写的lua脚本的限流算法好像和令牌桶算法及漏桶算法无关?
视频里写的lua脚本的限流算法好像和令牌桶算法及漏桶算法无关?实际生产上使用redis+lua限流方案时,一般lua脚本中的限流算法是什么呢?
45
收起
正在回答 回答被采纳积分+1
1回答
Java架构师讲师团
2020-02-25 11:24:41
视频里的lua脚本只是示例,告诉大家如何写一个简单的lua脚本并且和redis搭配使用。你可以参考spring cloud gateway组件里的lua脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | local tokens_key = KEYS[ 1 ] local timestamp_key = KEYS[ 2 ] --redis.log(redis.LOG_WARNING, "tokens_key " .. tokens_key) local rate = tonumber(ARGV[ 1 ]) local capacity = tonumber(ARGV[ 2 ]) local now = tonumber(ARGV[ 3 ]) local requested = tonumber(ARGV[ 4 ]) local fill_time = capacity/rate local ttl = math.floor(fill_time* 2 ) --redis.log(redis.LOG_WARNING, "rate " .. ARGV[ 1 ]) --redis.log(redis.LOG_WARNING, "capacity " .. ARGV[ 2 ]) --redis.log(redis.LOG_WARNING, "now " .. ARGV[ 3 ]) --redis.log(redis.LOG_WARNING, "requested " .. ARGV[ 4 ]) --redis.log(redis.LOG_WARNING, "filltime " .. fill_time) --redis.log(redis.LOG_WARNING, "ttl " .. ttl) local last_tokens = tonumber(redis.call( "get" , tokens_key)) if last_tokens == nil then last_tokens = capacity end --redis.log(redis.LOG_WARNING, "last_tokens " .. last_tokens) local last_refreshed = tonumber(redis.call( "get" , timestamp_key)) if last_refreshed == nil then last_refreshed = 0 end --redis.log(redis.LOG_WARNING, "last_refreshed " .. last_refreshed) local delta = math.max( 0 , now-last_refreshed) local filled_tokens = math.min(capacity, last_tokens+(delta*rate)) local allowed = filled_tokens >= requested local new_tokens = filled_tokens local allowed_num = 0 if allowed then new_tokens = filled_tokens - requested allowed_num = 1 end --redis.log(redis.LOG_WARNING, "delta " .. delta) --redis.log(redis.LOG_WARNING, "filled_tokens " .. filled_tokens) --redis.log(redis.LOG_WARNING, "allowed_num " .. allowed_num) --redis.log(redis.LOG_WARNING, "new_tokens " .. new_tokens) redis.call( "setex" , tokens_key, ttl, new_tokens) redis.call( "setex" , timestamp_key, ttl, now) return { allowed_num, new_tokens } |
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧