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

使用redis实现 令牌桶算法 漏桶算法

流量控制算法,用于限制请求的速率。
可以应对缓存雪崩

令牌桶算法

核心思想是:

  • 有一个固定容量的桶,里面存放着令牌(token)。
  • 每过一定时间(如 1 秒),桶中会自动增加一定数量的令牌,直到达到桶的容量上限。
  • 当有请求到来时,会从桶中取出一个令牌。如果桶中有令牌,则请求被允许通过;如果桶中没有令牌,则拒绝该请求。

基于 Redis 的实现

  • 初始化
    使用 Redis 的 Sorted Set(有序集合)来存储令牌。
    初始化时,向有序集合中添加一定数量的令牌,每个令牌的时间戳作为分数(score)。
ZADD user:rate_limit 1633072800 1633072800

或者,可以预先为每个用户生成大量令牌,时间戳作为分数,均匀分布在一定时间段内。

  • 令牌生成
    定期向桶中添加令牌。可以使用 Redis 的 ZADD 命令来添加新的令牌,每个令牌的时间戳作为分数。
ZADD user:rate_limit NX 1633072801 1633072801

这里的 NX 表示如果键不存在,则不执行操作(可选)。

  • 检查和消耗令牌
    当请求到来时,检查桶中是否有可用的令牌。可以使用 ZCOUNT 命令统计当前时间戳之前的有效令牌数量。
ZCOUNT user:rate_limit -inf +inf

如果有可用令牌,则使用 ZPOPMIN 命令取出一个令牌,并允许请求通过。

ZPOPMIN user:rate_limit

如果没有可用令牌,则拒绝请求。

  • 清理过期令牌
    定期清理过期的令牌,避免数据堆积。例如,可以使用 ZREMRANGEBYSCORE 命令删除时间戳小于当前时间的令牌。
ZREMRANGEBYSCORE user:rate_limit -inf $(current_time)

漏桶算法

漏桶算法类似于一个漏斗,它的核心思想是:
有一个固定容量的漏桶,里面存储着请求。
漏桶以恒定的速率将请求漏出(处理)。
当请求到达时,如果漏桶未满,则将请求放入漏桶;如果漏桶已满,则拒绝该请求。

基于 Redis 的实现

  • 初始化
    使用 Redis 的 String 类型键来存储漏桶的状态。例如,键 user:leaky_bucket 可以存储最后一个请求的时间戳。
SET user:leaky_bucket 1633072800
  • 请求处理
    当请求到来时,首先检查漏桶是否已满。这可以通过比较当前时间与最后一个请求的时间戳来实现。
    如果当前时间与最后一个请求的时间差小于漏桶的处理时间间隔(例如 1 秒),则认为漏桶已满,拒绝请求。
    否则,更新漏桶的时间戳,并允许请求通过。
SET user:leaky_bucket $(current_time)
  • 处理速率
    通过设置漏桶的处理速率(例如每秒处理一个请求)来控制流量。可以通过 Redis 的 SET 命令中的参数 NX 和 XX 来实现线程安全。

  • 总结
    令牌桶算法允许突发流量,适合作为速率限制器。
    漏桶算法适用于平滑流量的情况,适用于需要恒定处理速率的场景。

在 Redis 中,可以通过组合使用有序集合、字符串等数据结构以及原子操作(如 ZADD、ZPOPMIN 和 SET)来高效地实现这两类限流算法。

在这里插入图片描述


http://www.kler.cn/a/541918.html

相关文章:

  • 国产编辑器EverEdit - 迷你查找
  • Centos Ollama + Deepseek-r1+Chatbox运行环境搭建
  • HL7 资料汇总备忘录
  • 使用云计算,企业的数据监管合规问题如何解决?
  • Kafka系列之:定位topic只能保存最新数据的原因
  • 分析模式应用――帐务模式02
  • TCP传输层协议
  • Terraform 最佳实践:Top 10 常见 DevOps/SRE 面试问题及答案
  • 【使用 rimraf 闪电删除 node_modules 目录】
  • 嵌入式接单/派单网站
  • Cursor 编辑器详细介绍与使用
  • 负载测试和压力测试的原理分别是什么
  • Redis 集群工作原理? 如何通信?MOVED和ASKED 有什么区别
  • RabbitMQ消息队列 发送和接受
  • CP AUTOSAR标准之IOHardwareAbstraction(AUTOSAR_SWS_IOHardwareAbstraction)(更新中……)
  • 洛必达法则的证明与重要条件
  • DaDianNao:一种无主存储器的多核加速器
  • 机器学习算法的种类(机器学习类型的比较)
  • FPGA开发技能(10)热电偶测温ADS1118方案
  • Docker Desktop 镜像源配置
  • Spring Boot部署到服务器
  • 物联网智能语音控制灯光系统设计与实现
  • STM32_USART通用同步/异步收发器
  • soular基础教程-使用指南
  • Apifox与Apipost功能对比及选择建议(1):产品背景及API简单调试
  • Android系统分区概述和编译镜像包理解