讲师中心 微信公众号
AI工具推荐 视频效率加速

OpenResty 怎么使用 Lua 脚本实现分布式环境下的计数器限流

雨强同学_6000

雨强同学_6000

发布时间:2026-09-15 12:53:00

|

238人浏览过

|

来源于php中文网

原创

OpenResty通过Redis实现分布式限流,支持固定窗口(incrby)、滑动窗口(zset+Lua脚本)及lua-resty-limit-traffic模块三种方式,兼顾精度、性能与可靠性,并需考虑降级、key设计和可观测性。

openresty 怎么使用 lua 脚本实现分布式环境下的计数器限流

OpenResty 通过 Lua 脚本结合 Redis(或其他共享存储)可实现分布式计数器限流,核心思路是:将计数状态从单机内存提升到全局共享存储,利用原子操作保证并发安全。

使用 Redis + incrby 实现固定窗口计数器

这是最简单直接的分布式限流方式,适合对精度要求不高、能接受窗口切换时突增流量的场景。

  • access_by_lua* 阶段读取并更新 Redis 中的计数器,例如按用户 ID 或 IP 哈希分组
  • 使用 redis:incrby(key, 1) 原子递增,并用 redis:expire(key, window_sec) 设置过期时间(注意:需确保 key 首次设置时同时设 TTL,避免竞态)
  • 若返回值超过阈值,调用 ngx.exit(429) 拒绝请求

示例片段:

local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000)
red:connect("127.0.0.1", 6379)
local key = "rate_limit:" .. ngx.var.remote_addr
local count, err = red:incrby(key, 1)
if not count then
    ngx.log(ngx.ERR, "redis incr error: ", err)
    return
end
if count == 1 then
    red:expire(key, 60) -- 第一次写入才设过期,防重复设置
end
if count > 100 then
    ngx.status = 429
    ngx.say("Too many requests")
    ngx.exit(429)
end

用 Redis Lua 脚本实现滑动窗口(更精确)

固定窗口有临界问题,滑动窗口能更好平滑限流。OpenResty 可调用 Redis 的 EVAL 执行内嵌 Lua 脚本,保证“读-判-写”原子性。

Nginx Config Linter
Nginx Config Linter

对 Nginx 配置文件进行语法检查、验证和安全、性能审计。

下载
  • 使用 Redis 的 sorted set(zset)存储时间戳,score 为毫秒时间,member 为唯一请求标识(如 request_id 或空字符串)
  • 脚本中先 ZREMRANGEBYSCORE 清理过期项,再 ZCARD 获取当前窗口请求数,最后 ZADD 新条目
  • 整个逻辑封装为一个 Lua 脚本,由 OpenResty 用 red:eval(script, 1, key, now, window_ms, max_count) 调用

优点是无竞态、精度高;缺点是 zset 内存开销略大,高频小窗口下需评估 Redis 性能。

借助 lua-resty-limit-traffic 做声明式限流

OpenResty 官方模块 lua-resty-limit-traffic 已内置基于 Redis 的分布式限流支持(v0.08+),推荐优先使用,减少手写逻辑错误。

  • 配置 Redis 连接池,初始化 limit 对象时指定 redis_hostredis_port 等参数
  • 选择策略:如 limit.count(计数器)、limit.conn(连接数)、或 limit.req(漏桶/令牌桶)
  • 调用 limiter:incoming("my_key", true),返回剩余配额与是否受限;支持自定义 key(如 "user:" .. ngx.var.arg_uid

它内部已处理连接复用、失败降级(可 fallback 到本地内存计数)、以及原子脚本调用,生产环境更可靠。

注意事项与优化建议

分布式限流不是“加个 Redis 就行”,还需关注稳定性与可观测性。

  • Redis 故障时应有降级策略,比如 fallback 到 lua_shared_dict 做单机限流(用 zone 配置共享字典),避免雪崩
  • 限流 key 设计要合理:避免全站共用一个 key;推荐按业务维度拆分,如 "api:/order/create:uid_123"
  • 开启 lua_code_cache off 仅用于开发调试,生产务必开启以避免重复加载 Lua 脚本影响性能
  • 配合 OpenResty 日志变量(如 $limit_rate_status)记录限流行为,便于后续分析和告警

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
loomy官网入口地址合集
loomy官网入口地址合集

本专题汇总了 Loomy 桌面 AI 助理的官方入口地址合集及使用指南。提供 macOS 与 Windows 客户端下载 。Loomy 是讯飞推出的桌面级 AI 工作搭子,支持文件整理、数据分析、网页操作及通过飞书/钉钉远程操控电脑,助你高效完成本地办公任务 。

0

2026.09.22

NumPy常见函数使用方法
NumPy常见函数使用方法

本专题整理 NumPy 常见函数使用方法相关教程,覆盖函数大全、参数用法、数组运算、统计聚合、排序处理、where 条件筛选、linspace 创建数列等常用场景,帮助读者快速掌握 NumPy 函数调用思路和实际数据处理技巧。

0

2026.09.22

NumPy性能优化版本更新与常见报错排查
NumPy性能优化版本更新与常见报错排查

本专题整理 NumPy 性能优化、版本更新与常见报错排查相关教程,覆盖向量化计算、广播性能、内存布局、NumPy 2.0 升级、版本兼容冲突、安装导入报错、dtype 溢出、矩阵运算异常和 broadcasting 报错修复,帮助读者系统掌握 NumPy 性能调优与问题定位方法。

20

2026.09.22

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

20

2026.09.21

NumPy随机数文件读写与dtype数据类型
NumPy随机数文件读写与dtype数据类型

本专题整理 NumPy 随机数、文件读写与 dtype 数据类型相关教程,覆盖 Generator/random、随机数种子、正态分布采样、npy/npz/CSV/TXT 保存读取、loadtxt/savetxt、memmap、大文件处理、astype 类型转换、结构化 dtype、整数溢出和精度丢失等场景。

20

2026.09.21

NumPy矩阵运算与线性代数计算
NumPy矩阵运算与线性代数计算

本专题整理 NumPy 矩阵运算与线性代数计算相关教程,覆盖矩阵乘法、dot 与 @ 运算符、逆矩阵、行列式、特征值与特征向量、SVD、线性方程组、欧氏距离、矩阵分解和大规模矩阵性能优化等内容,帮助读者掌握 np.linalg 与矩阵计算实战。

0

2026.09.21

NumPy广播机制数学运算与统计分析
NumPy广播机制数学运算与统计分析

本专题整理 NumPy 广播机制、数组数学运算与统计分析相关教程,覆盖广播规则、维度对齐、矩阵与数组加减除法、向量化计算、均值方差、分位数、中位数、直方图和 unique 频次统计等场景,帮助读者掌握 ndarray 高效计算与统计处理方法。

0

2026.09.21

NumPy数组创建索引切片与数据选择
NumPy数组创建索引切片与数据选择

本专题整理 NumPy 数组创建、索引、切片与数据选择相关教程,覆盖 np.array、zeros/ones、多维数组形状、基础切片、花式索引、布尔索引、条件筛选、视图与副本等常用场景,帮助读者系统掌握 ndarray 数据构造与高效提取方法。

20

2026.09.21

Aionclaw智能助手介绍
Aionclaw智能助手介绍

本专题汇总了AionClaw(AI龙虾助手)的功能介绍与在线使用入口。AionClaw是杭州趣猿人工智能有限公司推出的桌面级AI智能体,能直接在电脑上读写文件、运行脚本、操作浏览器,自动交付Word、PPT、Excel等成品。

40

2026.09.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

nginx手册
nginx手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn