redis+lua实现滑动窗口限流_清茶的博客-程序员秘密

技术标签: java  滑动窗口算法  

前言

关于滑动时间窗口算法以及更多限流实践请走:接口限流实践

脚本

主要是利用redis的有序集合(zset)来实现,计算前一秒内已访问的次数主要使用zcount命令来计算在当前集合中指定区间分数内的成员数,如果不使用lua脚本,各命令调用之间会存在并发隐患,而redis会将整个lua脚本作为一个命令执行,保证原子操作,无需担心并发,我们可以将所有计算逻辑均放在脚本内,脚本如下:

local key = KEYS[1]
-- 一个时间窗口限制数量
local limitCount = tonumber(ARGV[1])
-- 获取当前时间,单位毫秒
local currentTime = tonumber(ARGV[2])
-- 当前时间戳的key值,唯一
local timeKey = ARGV[3]
-- 获取时间窗口范围,传参单位秒,默认窗口一秒
local timeRange
if ARGV[4] == nil then
	timeRange = 1000
else
	timeRange = tonumber(ARGV[4]) * 1000
end
-- 获取集合key过期时间,当key过期时会存在瞬时并发的情况,因此过期时间不能太短或者改用定时清除,传参单位秒,默认一小时
local expiration
if ARGV[5] == nil then
	expiration = 3600
else
	timeRange = tonumber(ARGV[5])
end
-- 前一秒内已访问的次数
local beforeCount = 0
local existKey = redis.call('exists', key)
if (existKey == 1) then
	-- 计算前一秒访问次数
	beforeCount = redis.call('zcount', key, currentTime - timeRange, currentTime)
end
-- 记录当前访问时间
redis.call('zadd', key, currentTime, timeKey)
local result = 0
if (limitCount > beforeCount) then
	result = 1
end
-- 设置过期时间
redis.call('expire', key, expiration)
return result

需要注意的是,有序集合中的key必须保持唯一,不能采用时间戳

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_38001814/article/details/113643374

智能推荐

防火墙的web配置_Sun.1998的博客-程序员秘密_web应用防火墙配置

防火墙:它是一种位于内部网络与外部网络之间的网络安全系统。一项信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成,防火墙就是一个位于计算机和它所连接的网络之间的软件或硬件。该计算机流入流出的所有网络通信和数据包均要经过此防火墙。在网络中,所谓“防火墙”,是指一种将内部网和公众访问网(如Internet)分开的方法,它实际上是一种隔离技术。防火墙是在两个网络通讯时执行的一种访问控制尺度,它能允许你“同意”的人和数据进入你的网络,

Javascript学习(三) --------- DOM编程_在森林中麋了鹿的博客-程序员秘密

目录一、DOM与BOM二、JS内置对象三、获取文本框的值四、innerText 与 innerHTML五、正则表达式六、去除文本框输入值左右两侧的空格七、表单验证八、获取下拉列表中的value一、DOM与BOM两者的定义DOM:Document Object Model ---------文档对象模型 :对网页当中的节点进行增删改的过程。HTML文档被当做一棵DOM树来看待。BOM:Browser Object Model ---------- 浏览器对象模型 :主要操作有关闭浏览器窗口、打开

Java开发环境搭建(windows版、史上最详细版)_不倒的土豆的博客-程序员秘密_java环境搭建

转自:https://blog.csdn.net/runing_it_man/article/details/77800639Java开发环境搭建在本章节中我们将为大家介绍如何搭建Java开发环境。我使用的是windows系统,那就给大家讲一下在windows系统下搭建java的开发环境。Jdk介绍JDK(Java Development Kit)是 Java 语言的软件开发工具包,主要用于移动设...

阿里巴巴Java开发手册一周年最终版_简简单单OnlineZuozuo的博客-程序员秘密

阿里巴巴Java开发手册一周年最终版摘要:阿里巴巴集团推出的《阿里巴巴Java开发手册》是阿里巴巴近万名开发同学集体智慧的结晶,以开发视角为中心,详细列举如何开发更加高效、更加容错、更加有协作性,力求知其然,更知其不然,结合正反例,让Java开发者能够提升协作效率、提高代码质量。 《阿里巴巴Java开发手册》系统性地从编程、数据库、异常日志、工程结构、安全、单元测试六大方面,...

地大计算机文化基础多选题,地大14春学期《计算机文化基础》期末作业考核_规则哥讲规则的博客-程序员秘密

地大14春学期《计算机文化基础》期末作业考核单选题 多选题 判断题一、单选题(共 10 道试题,共 40 分。)1.计算机病毒是一种()A. 特殊的计算机部件B. 游戏软件C. 人为编制的特殊程序D. 能传染的生物病毒-----------------选择:C2.计算机中的所有信息都是以二进制形式表示的,其主要原因是( )A. 运算速度快B. 信息处理方便C. 节约元器件D. 所用的元器件...

随便推点

防火墙概述_时不待我。的博客-程序员秘密

防火墙概述目录下一代防火墙的概述1.防火墙的定义1.1什么是防火墙?1.2防火墙的分类1.3防火墙的功能1.4防火墙的安全策略1.4.1防火墙安全策略原理1.4.2防火墙安全策略作用1.4.3防火墙安全策略分类2.防火墙的相关技术2.1包过滤技术2.1.1包过滤的基础2.1.2包过滤防火墙的工作过程2.2会话机制2.2.1状态防火墙原理2.2.2会话表项2.2.3状态检测防火墙的转发机制2.3应用...

bom编程+事件编程+dom编程+正则表达式_upupxi的博客-程序员秘密

一.BOM编程 什么是BOM编程?(将浏览器的各个部分封装成了不同的对象) BOM是(Broswer Object Model) 浏览器对象模型编程 1.window对象<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml

JavaScript的DOM和BOM编程_Eternal_yys的博客-程序员秘密

文章目录1. BOM编程(了解学习)1. 窗口对象:window2. 地址栏对象:location3. 历史记录对象:history4. 屏幕对象:screen2. DOM编程1. DOM编程入门2. 获取标签对象的三种方式1. document集合属性来获取标签对象2. 查询节点关系来获取标签对象3. 通过document对象的方法获取(最常用)3. js的事件编程1. 事件基础案例2. 常用...

java学习【web基础-BOM编程,事件编程,DOM编程,正则表达式】_huiyan_edu的博客-程序员秘密

1.BOM编程 什么是BOM编程?(画图讲解,将浏览器的各个部分封装成了不同的对象) BOM是(Broswer Object Model) 浏览器对象模型编程在咱们的网页被加载后,我们的js引擎会将我们的浏览器的各个部分封装成对象,我们通过操作这些不同的对象来实现一些效果,这就是BOM编程1.1.window对象open(): 在一个窗口中打开页面参数一: 打开的页面参数二:打开的方式。

Web前端学习(4)_BOM编程_事件编程_晴天小风的博客-程序员秘密

Web前端学习(4)_BOM编程_事件编程_DOM编程这篇来写关于BOM编程、事件编程以及DOM编程的内容。1.BOM编程1.1 BOM编程将浏览器的各个部分封装成了不同的对象)BOM是(Broswer Object Model) 浏览器对象模型编程

JavaScript零基础入门--笔记动力节点最新老杜(五)全套笔记精髓_听~宇的博客-程序员秘密_动力节点老杜笔记

DOM编程-获取文本框的value1、JavaScript包括三大块: ECMAScript:JS的核心语法(ES规范 / ECMA-262标准) DOM:Document Object Model(文档对象模型:对网页当中的节点进行增删改的过程。)HTML文档被当做一棵DOM树来看待。 var domObj = document.getElementById("id");...