当前位置: 首页 > article >正文

【PmHub面试篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现面试专题解析

你好,欢迎来到本次关于PmHub中基于Redis加Lua脚本的计数器算法限流实现的面试系列分享。在这篇文章中,我们将深入探讨这一技术领域的相关面试题预测。若想对相关内容有更透彻的理解,强烈推荐参考之前发布的博文:【PmHub后端篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现

1 什么是限流?在什么场景下需要使用限流?

  • 限流是一种控制流量的方法,主要用于防止系统过载,保障服务的稳定性
  • 在高并发场景下,比如电商秒杀、抢购活动等,我们需要限流来防止系统被突发的大量请求压垮

2 常用算法有哪些?

常用算法包括计数器、滑动窗口、漏桶、令牌桶等。

限流算法原理优点缺点
计数器(Counter)法在固定时间窗口内统计请求数,超过阈值则拒绝请求实现简单,适用于固定时间窗口的流量控制无法处理突发流量
滑动窗口计数器法将固定时间窗口分成多个小窗口,通过滑动小窗口动态统计总请求数平滑处理流量,比固定窗口更有效实现复杂度较高
漏桶(Leaky Bucket)算法请求进入漏桶,漏桶以恒定速率出水,当桶满时新的请求被丢弃平滑突发流量,严格控制请求处理速率可能导致请求延迟增加
令牌桶(Token Bucket)算法系统按恒定速率生成令牌,请求消耗令牌,当没有令牌时请求被拒绝或排队允许突发流量处理,能长期控制处理速率实现相对复杂,需要管理令牌
漏桶与令牌桶的组合将漏桶与令牌桶结合,既能控制平均速率,又能应对突发流量综合两者优点,既能平滑流量又能应对突发流量实现复杂度更高

3 能简要介绍一下计数器算法的基本原理吗?

  • 计数器算法的基本原理是在固定时间窗口内对请求次数进行计数
  • 如果请求次数超过设定的阈值,就拒绝后续的请求。这个时间窗口可以是1秒、1分钟等。

4 为什么选择 Redis+Lua 实现限流?

  • Redis具有高性能、单线程的特点,能够处理高并发请求
  • 同时,Redis提供了丰富的数据结构和原子操作,使得限流算法的实现更加简单高效
  • Lua 脚本减少网络交互次数,并通过原子性避免并发问题。
  • 相比本地缓存(如 Guava),Redis 支持跨服务实例的统一限流,更适合微服务架构。

5 您是如何在Redis中实现计数器算法的限流的?能详细描述一下实现过程吗?

  • 注解+AOP 切面+Lua 脚本
  • 用自己理解的话来描述,具体应用场景,在登录接口添加限流。
  • 简述实现过程:定义限流配置(RedisConfig)->自定义限流注解->AOP 切面实现限流逻辑-> 登录接口应用注解

6 登录接口为何需要单独限流?

  • 登录接口通常配置在网关白名单,绕过网关认证,无法被全局限流捕获
  • 登录接口易被暴力破解或高频刷取,需独立防护。通过 Redis+Lua 可精准限制单个用户 / IP 的请求频率。

7 您是如何处理并发请求的?在高并发场景下,限流策略是否依然有效?

  • 通过Redis单线程的特点和Lua脚本的原子性来处理并发请求,确保计数器的准确性。
  • 在高并发场景下,限流策略依然有效,因为Redis的高性能和Lua脚本的原子操作可以应对大量请求

8 有自己压测过吗?怎么压测的?

  • 有, 使用JMeter发送1秒10个请求, 或者1秒100请求等
  • 在不同的并发请求下, 所得出的结果均符合预期

9 当限流计数器达到上限时,您是如何处理用户请求的?是否有备用方案?

  • 计数器达到上限时,我们会拒绝后续的请求,并返回一个友好的错误信息
  • 同时,我们会记录这些被拒绝的请求,以便后续进行分析和调整限流策略

10 参考链接

  1. PmHub实现Redis加Lua脚本基于计数器算法的限流
  2. Redis+Lua登录限流相关
http://www.lryc.cn/news/2403549.html

相关文章:

  • 计算机网络领域所有CCF-A/B/C类期刊汇总!
  • 有意向往gis开发靠,如何规划学习?
  • 五、查询处理和查询优化
  • 缓解骨质疏松 —— 补钙和补维 D
  • 《PMBOK® 指南》第八版草案重大变革:6 大原则重构项目管理体系
  • Ctrl+R 运行xxx.exe,发现有如下问题.
  • 极智项目 | 基于PyQT+Whisper实现的语音识别软件设计
  • vue+cesium示例:地形开挖(附源码下载)
  • 升级:用vue canvas画一个能源监测设备和设备的关系监测图!
  • Elasticsearch + Milvus 构建高效知识库问答系统《一》
  • 深入理解 transforms.Normalize():PyTorch 图像预处理中的关键一步
  • leetcode 2434. 使用机器人打印字典序最小的字符串 中等
  • 爆炸仿真的学习日志
  • 【Fiddler抓取手机数据包】
  • [华为eNSP] OSPF综合实验
  • 东芝Toshiba DP-4528AG打印机信息
  • Vue3+Vite中lodash-es安装与使用指南
  • 完美搭建appium自动化环境
  • c++中的输入输出流(标准IO,文件IO,字符串IO)
  • App使用webview套壳引入h5(三)——解决打包为app后在安卓机可物理返回但是在苹果手机无法测滑返回的问题
  • CSS中text-align: justify文本两端对齐
  • 2025年渗透测试面试题总结-ali 春招内推电话1面(题目+回答)
  • C#中的依赖注入
  • Reactor和Proactor
  • 黄晓明新剧《潜渊》定档 失忆三面间谍开启谍战新维度
  • 深入浅出Java ParallelStream:高效并行利器还是隐藏的陷阱?
  • 物联网嵌入式开发实训室建设方案探讨(高职物联网应用技术专业实训室建设)
  • 集成学习三种框架
  • 大数据量高实时性场景下订单生成的优化方案
  • 在UI界面内修改了对象名,在#include “ui_mainwindow.h“没更新