Comment utiliser Redis et Lua pour développer la fonction limiteur de courant
Introduction :
Avec le développement d'Internet, de nombreuses applications sont confrontées au défi de la haute concurrence. Face à un grand nombre de demandes, des mesures doivent être prises pour protéger la stabilité et la disponibilité du système. L'un des moyens importants est la limitation du courant. La limitation de courant fait référence au contrôle du flux de demandes pour garantir que le système peut toujours fonctionner normalement pendant les pics de charge. Cet article expliquera comment développer une fonction simple de limiteur de courant à l'aide de Redis et Lua, et fournira des exemples de code spécifiques.
1. Introduction à Redis
Redis est une base de données open source en mémoire largement utilisée dans le cache, les files d'attente de messages, les compteurs, les classements et d'autres scénarios. Ses structures de données hautes performances et flexibles en font le premier choix pour de nombreuses applications. Dans le développement des limiteurs actuels, les opérations atomiques de Redis et les capacités de script Lua intégrées seront très utiles.
2. Idée de conception du limiteur de courant
Le limiteur de courant comporte principalement trois facteurs clés : un taux de demande limité, une fenêtre de temps et un compteur. Dans Redis, nous pouvons utiliser Sorted Set pour stocker des paires clé-valeur de numéro de demande et d'horodatage. Les idées de conception spécifiques sont les suivantes :
3. Exemple de code d'implémentation spécifique
Ce qui suit est un exemple de code d'implémentation spécifique d'un limiteur de courant développé à l'aide de Redis et Lua.
local limitKey = 'limit:' .. KEYS[1] local rate = tonumber(ARGV[1]) local interval = tonumber(ARGV[2]) redis.call('DEL', limitKey) redis.call('ZADD', limitKey, redis.call('TIME')[1], rate) redis.call('PEXPIRE', limitKey, interval * 1000)
local limitKey = 'limit:' .. KEYS[1] local now = tonumber(ARGV[1]) local interval = tonumber(ARGV[2]) local maxRequests = tonumber(ARGV[3]) redis.call('ZREMRANGEBYSCORE', limitKey, '-inf', '(' .. now - interval) redis.call('ZADD', limitKey, now, now) if redis.call('ZCARD', limitKey) > maxRequests then return 0 else return 1 end
Quatrièmement, utilisez le limiteur de courant pour implémenter la limitation de demande
Nous pouvons encapsuler le code ci-dessus dans une fonction de limiteur de courant réutilisable, pour d'autres candidatures à appeler. Voici un exemple simple :
local function limitRequest(bucket, rate, interval, maxRequests) local limitKey = 'limit:' .. bucket local now = tonumber(redis.call('TIME')[1]) redis.call('ZREMRANGEBYSCORE', limitKey, '-inf', '(' .. now - interval) redis.call('ZADD', limitKey, now, now) redis.call('PEXPIRE', limitKey, interval * 1000) if redis.call('ZCARD', limitKey) > maxRequests then return 0 else return 1 end end local bucket = 'api:rate_limiter' local rate = 10 -- 最大请求数 local interval = 60 -- 时间窗口大小(秒) local maxRequests = 100 -- 限制的请求数量 local allowed = limitRequest(bucket, rate, interval, maxRequests) if allowed == 1 then -- 允许请求 -- TODO: 处理请求 else -- 拒绝请求 -- TODO: 返回错误信息 end
En appelant la fonction limitRequest
, nous pouvons facilement implémenter la fonction de restriction demandée.
Résumé :
Cet article présente comment utiliser Redis et Lua pour développer une fonction simple de limiteur de courant et donne des exemples de code spécifiques. Le limiteur de courant peut nous aider à contrôler le flux de demandes et à protéger la stabilité et la disponibilité du système. Dans les applications réelles, vous pouvez personnaliser et développer davantage en fonction de vos propres besoins. J'espère que cet article vous sera utile.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!