Redis + lua implementa el límite de corriente de la ventana deslizante

Prefacio

Sobre el algoritmo de ventana de tiempo deslizante y las prácticas de limitación más actuales, vaya a: Interfaz de prácticas de limitación de corriente

texto

Se realiza principalmente mediante el uso del conjunto ordenado de redis (zset). Para calcular el número de visitas en el segundo anterior, el comando zcount se utiliza principalmente para calcular el número de miembros en el intervalo especificado puntuación en el conjunto actual. El script lua no se usa, cada comando se llama Habrá un peligro oculto de concurrencia, y redis ejecutará todo el script lua como un comando para garantizar operaciones atómicas y no hay necesidad de preocuparse por la concurrencia. el guión. El guión es el siguiente:

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

Cabe señalar que la clave en el conjunto ordenado debe ser única y la marca de tiempo no se puede utilizar

Supongo que te gusta

Origin blog.csdn.net/m0_38001814/article/details/113643374
Recomendado
Clasificación