分布式限流的基本概念
分布式限流是指在分布式系统中对请求进行速率限制,防止系统过载。与单机限流不同,分布式限流需要考虑多个节点之间的协调问题。常见的限流算法包括令牌桶、漏桶、滑动窗口等。
分布式限流的实现方式
基于Redis的令牌桶算法
Redis的原子操作和过期特性非常适合实现分布式限流。以下是一个基于Redis和Lua脚本的令牌桶算法实现:
-- token_bucket.lua
local key = KEYS[1] -- 限流key
local limit = tonumber(ARGV[1]) -- 桶容量
local interval = tonumber(ARGV[2]) -- 时间间隔(秒)
local current = tonumber(redis.call('get', key) or "0")
if current + 1 > limit then
return 0 -- 超过限制
else
redis.call('incrby', key, 1)
redis.call('expire', key, interval)
return 1 -- 允许通过
end
Java调用示例:
public boolean isAllowed(String key, int limit, int interval) {
String script = "local key = KEYS[1]\n" +
"local limit = tonumber(ARGV[1])\n" +
"local interval = tonumber(ARGV[2])\n" +
"local current = tonumber(redis.call('get', key) or \"0\")\n" +
"if current + 1 > limit then\n" +
" return 0\n" +
"else\n" +
" redis.call('incrby', key, 1)\n" +
" redis.call('expire', key, interval)\n" +
" return 1\n" +
"end";
Long result = jedis.eval(script,
Collections.singletonList(key),
Arrays.asList(String.valueOf(limit), String.valueOf(interval)));
return result == 1

被折叠的 条评论
为什么被折叠?



