lua 令牌桶 源码_Nginx + Lua + Redis 实现基础的令牌桶算法限流

本文介绍了令牌桶算法的原理,每秒填充固定数量的令牌,请求需要消耗令牌,无令牌则拒绝服务。通过Nginx、Lua和Redis实现限流方案,利用Redis的EVAL命令保证并发安全。当遇到Write commands not allowed错误时,因Redis要求脚本执行结果确定性,解决方案是在脚本开头加入redis.replicate_commands()。
摘要由CSDN通过智能技术生成

关于令牌桶( token bucket )

令牌桶限流的原理是系统以一个恒定的速度往固定容量的桶里放入令牌,当有请求进来时,需要先从桶里获取并消耗一个令牌,当桶里没有令牌可取时,则拒绝服务或让请求等待。

如图:

每隔 1/r 秒向 bucket 中填充一个 token ;

bucket 最多只能存放 b 个 token ,如果填充 token 时 bucket 已经满了,这丢弃这个 token ;

当请求到达时,从 bucket 获取并消耗一个 token ,并处理请求;

如果 bucket 中的 token 数不足,则不消耗 token ,直接拒绝处理本次请求。

在取 token 时可以通过计算上次取跟这次取之间按照速率会产生多少个 token 加上上次剩余的 token ,然后比较剩余 token 数来替代使用一个线程支持在后台持续更新 token 的方案来避免性能问题。

参考文章:

代码地址

关于实现

在采用 Nginx + Lua 实现限流方案时,利用 Redis 的 EVAL 命令的原子性来保证令牌桶相关运算逻辑在对 token 进行加减计算时的并发安全。

Redis 的 EVAL 命令可以执行 Lua 脚本内容,将需要执行的 Lua 代码以字符串内容的形式传入,并传入脚本内容需要的相关参数, Redis 会使用单个 Lua 解释器去运行所有脚本,并且 Redis 也保证脚本会以原子性(atomic)的方式执行:当某个脚本正在运行的时候,不会有其他脚本或 Red

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值