Maison > Article > développement back-end > PHP+Redis résout le problème pratique de la limitation du flux de commandes
1. Chaque numéro de cette série d'articles résoudra un problème pratique de Redis
2. Les questions de chaque numéro seront sélectionnées à partir des commentaires de chaque numéro
3 Les questions sont limitées à Redis. d'autres questions, je n'exclus pas de commencer une nouvelle série.
4. J'utilise souvent PHP, donc la solution est principalement PHP
5 Quand il n'y a pas de questions appropriées dans les commentaires, je me poserai des questions
Problème. description :
C'est le premier numéro, donc je suis le seul à pouvoir poser vos propres questions
Comment utiliser Redis pour limiter le flux de commandes, par exemple autoriser N accès toutes les M secondes
Solution :
<?php /** * 是否允许放行 * @param string $key redis键前缀 * @param int $timeInterval 时间间隔(秒) * @param int $max 时间间隔内最大放行数 * @return bool 是否放行 * @throws Exception * @example * <pre class="brush:php;toolbar:false"> * //每秒放行一个 * isAllow('my_allow'); * * //每秒放行3个 * isAllow('my_allow',1,3); * * //每3秒放行2个 * isAllow('my_allow',3,2); */ function isAllow(string $key, int $timeInterval=1, int $max=1):bool{ if($timeInterval<1){ throw new Exception('时间间隔必须大于0'); } if($max<1){ throw new Exception('最大放行数必须大于0'); } $redis=new Redis(); $redis->connect('192.168.31.187'); if(!$redis->isConnected()){ throw new Exception('Redis服务连接失败'); } //对时间戳取模,使得每$timeInterval秒取得同一个时间戳 $time=time(); $key.=':'.($time-($time%$timeInterval)); //自增并返回自增后的结果 $index=$redis->incr($key); //如果是第一个访问,设置键的过期时间 if($index===1){ $redis->expire($key,$timeInterval+1); } return $index<$max+1; }
Interprétation du code :
Modulez le temps pour que le nom de la clé tous les $timeInterval soit mis à jour une fois par seconde
méthode incr() pour incrémenter la valeur de la clé si la clé n'existe pas. créez d'abord une clé avec une valeur de 0 puis auto-incrémentez
Selon le principe de l'auto-incrémentation, le numéro sous le même nom de clé La valeur renvoyée par N fois d'auto-incrémentation est N
Le nom de la clé est mis à jour toutes les $timeInterval secondes, donc la clé n'aura plus de valeur après $timeInterval+1 secondes de création de la clé
Pour ce qui précède, tout le monde est invité à poser des questions et des corrections Erreur, supplément, optimisation.
Recommandé : "Tutoriel vidéo PHP"
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!