上一篇
场景引入:
凌晨3点,你的电商系统突然被羊毛党狂刷优惠券接口,服务器CPU飙到99%… 😱 这时候如果有个「智能水龙头」,能控制流量忽大忽小,是不是很香?今天我们就用Redis手搓一个行业经典的令牌桶限流器!
想象一个水池(桶),系统以固定速率往里面丢令牌(Token),每个请求必须抢到令牌才能通行,没抢到的请求要么排队要么被拒。
核心优势:
用Hash存储桶状态,Key规则:rate_limit:{业务ID}
HSET rate_limit:coupon tokens 100 # 当前令牌数 last_time 1735660800 # 上次补充时间戳(2025-08示例) rate 10 # 每秒生成10个令牌 capacity 200 # 桶最大容量
local key = KEYS[1] local now = tonumber(ARGV[1]) local tokens_requested = tonumber(ARGV[2]) local rate = tonumber(redis.call("HGET", key, "rate")) local capacity = tonumber(redis.call("HGET", key, "capacity")) local last_time = tonumber(redis.call("HGET", key, "last_time")) -- 计算新增的令牌数(按时间差*速率) local new_tokens = (now - last_time) * rate local current_tokens = tonumber(redis.call("HGET", key, "tokens")) current_tokens = math.min(current_tokens + new_tokens, capacity) -- 不能超过桶容量 -- 判断是否允许请求 if current_tokens >= tokens_requested then redis.call("HSET", key, "tokens", current_tokens - tokens_requested) redis.call("HSET", key, "last_time", now) return 1 -- 成功 else return 0 -- 失败 end
def is_allowed(): timestamp = time.time() result = redis.eval(lua_script, 1, "rate_limit:coupon", timestamp, 1) # 每次消耗1个令牌 return result == 1
INFO KEYSPACE
监控限流触发次数 :令牌桶就像个智能流量阀门🚪,而Redis的原子性和高性能让它成为分布式限流的黄金搭档,下次遇到流量暴增,不妨掏出这个方案,让你的系统稳如泰山!
ℹ️ 本文技术点验证基于Redis 7.2+版本(2025-08环境)
本文由 丰萦思 于2025-08-02发表在【云服务器提供商】,文中图片由(丰萦思)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/510873.html
发表评论