Parfois, nous devons limiter la fréquence d'accès à une API ou à une page, par exemple le nombre de fois qu'une seule adresse IP ou un seul utilisateur peut accéder en une minute. De telles exigences peuvent être facilement mises en œuvre à l'aide de Redis.
Stratégie 1 :
Enregistrez une valeur de comptage (int) dans Redis, la clé est user:$ip et la valeur est le nombre de visites à l'ip. Lors de la définition de la clé pour la première fois, l'ensemble expire.
Avant d'ajouter 1 au décompte, déterminez si la clé existe. Si elle n'existe pas, il y a deux situations : 1. L'IP n'a pas été accédée 2. L'IP a été accédée, mais la clé ; est expiré. Ensuite, vous devez à nouveau définir l'expiration à ce moment-là.
Si l'utilisateur accède, déterminez si la valeur de count est supérieure à la limite supérieure, si elle est inférieure à la limite supérieure, traitez la demande, sinon refusez de traiter la demande.
Stratégie 2 :
Considérez cette situation, en supposant que les utilisateurs ne sont autorisés à accéder que 100 fois en 60 secondes si un utilisateur accède 1 fois dans la 1ère seconde, dans la 59ème. À 61 secondes, il a été consulté 99 fois, puis à 61 secondes, il a été consulté 100 fois.
Si elle est traitée conformément à la politique 1, 100 demandes ont été reçues entre la 1ère et la 60ème seconde, et 100 demandes ont été reçues à la 61ème seconde, donc l'IP ne sera plus traitée pendant la période 62~120 demandes.
Il semble qu'il n'y ait pas de problème, mais si vous y réfléchissez bien, 99+100=199 requêtes ont été acceptées entre les secondes 59 et 61, et l'intervalle de temps n'est que de 3 secondes. Dans ce cas, il y a un problème avec la conception originale.
Solution : vous pouvez utiliser la structure de données de liste (file d'attente bidirectionnelle) de redis. La clé est user:$ip, c'est-à-dire qu'une file d'attente bidirectionnelle est configurée pour chaque adresse IP. le jugement suivant est effectué :
1. Si le nombre d'éléments dans la liste est inférieur à 100, alors l'horodatage Lpush lorsque la demande arrive est ajouté à la liste.
2. S'il y a plus de 100 éléments dans la liste, supprimez Lindex(-1), qui est le plus à droite, qui est l'horodatage de la première requête parmi les 100 requêtes. timestamp Si la différence avec l'horodatage actuel est supérieure à 60 secondes, cela signifie que la première requête a expiré et la première requête sera retirée de la file d'attente Rpop. Mettez ensuite l'horodatage actuel en file d'attente dans Lpush.
Pour plus de connaissances sur Redis, veuillez faire attention à la colonne Tutoriel d'introduction à Redis.
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!