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

基于 Redis 实现滑动窗口的限流

⏳ 限流场景:突发流量,恶意流量,业务本身需要

基于 Redis 实现滑动窗口的限流是一种常见且高效的做法。Redis 是一种内存数据库,具有高性能和支持原子操作的特点,非常适合用来实现限流功能。下面是一个使用 Redis 实现基于滑动窗口的限流算法的简单示例:

滑动窗口

📐其实这个方法就是把上边的粒度进行切分,切分成更小力度的计数器,就像是上边的切分成一小块一小块,每块时间超出了指定的请求就阻挡在外,越小力度,则限流越好。

import time
import redisclass SlidingWindowRateLimiter:def __init__(self, window_size, limit, redis_conn):self.window_size = window_sizeself.limit = limitself.redis_conn = redis_conndef allow_request(self, key):current_time = int(time.time() * 1000)pipeline = self.redis_conn.pipeline()pipeline.zadd(key, {current_time: current_time})pipeline.zremrangebyscore(key, '-inf', current_time - self.window_size)pipeline.expire(key, self.window_size / 1000 + 1)  # 设置过期时间,略大于窗口大小pipeline.execute()count = self.redis_conn.zcard(key)if count <= self.limit:return Trueelse:return False

在这个示例中,我们利用 Redis 的有序集合(sorted set)来实现滑动窗口。每个请求到达时,都会向有序集合中添加当前时间戳,并通过 zremrangebyscore 方法移除超出时间窗口范围的时间戳。最后,通过 zcard 方法统计有序集合中的成员数量,从而判断是否允许新的请求。

需要注意的是,上述代码仅为示例,实际应用中可能需要考虑更多因素,比如分布式环境下的原子操作、并发访问的线程安全性、异常处理等。另外,在实际生产环境中,还可以结合 Lua 脚本和 Redis 的事务机制来实现更复杂的限流策略。

总之,基于 Redis 实现滑动窗口的限流是一种常见且高效的做法,可以有效地控制系统的并发访问量。

http://www.lryc.cn/news/450826.html

相关文章:

  • Camera Raw:打开图像
  • RK3588主板PCB设计学习(六)
  • 论文阅读(十一):CBAM: Convolutional Block Attention Module
  • 【Kubernetes】常见面试题汇总(四十八)
  • Qt Creator安卓环境配置【筑基篇】
  • 利用SpringBoot构建高效社区医院平台
  • 【C++ 前缀和 数论】1590. 使数组和能被 P 整除|2038
  • 外部引入的 JavaScript 放置位置
  • 【tbNick专享】虚拟机域控、成员服务器、降级等管理
  • Raspberry Pi3B+之Rpanion(gst)和ffmpeg验证
  • 数据结构编程实践20讲(Python版)—04队列
  • Ubuntu开机进入紧急模式处理
  • 解决无网条件下离线安装缺失的python包
  • 海外媒体投稿:如何运用3种国内外媒体套餐发稿突出重围?
  • Spring DI 笔记
  • psutil库的使用说明
  • PMP--三模--解题--71-80
  • iTextPDF 一个功能强大的 Java PDF 库
  • QT C++ 自学积累 『非技术文』
  • 浅谈虚拟内存(操作系统、Redis)
  • 【LeetCode HOT 100】详细题解之链表篇
  • 二叉树的递归遍历
  • 国内访问OpenAI API
  • 深入 Spring RestTemplate 源码:掌握 HTTP 通信核心技术
  • 计算机网络:计算机网络概述 —— 初识计算机网络
  • set和map结构的使用
  • 2. qt_c++反射实例
  • 卷积神经网络(CNN)的计算量和参数怎么准确估计?
  • Ruby基础语法
  • 插入排序C++