recherche

Maison  >  Questions et réponses  >  le corps du texte

Redis 如何限制短信发送

暂时不考虑 ip,什么的限制,只考虑 手机号限制,

如何用redis做到限制,一个手机号,1分钟内最多发一条,一天内最多10条

各位大神有什么好方案,先谢!(崇拜脸)

迷茫迷茫2820 Il y a quelques jours987

répondre à tous(6)je répondrai

  • 漂亮男人

    漂亮男人2017-04-27 09:05:05

    Nécessite deux caches

    1. nom de la clé, téléphone occupé, mis en cache pendant 1 minute

    2. nom clé phone-send-count, mis en cache pendant 1 jour, +1 pour chaque envoi réussi

    Le processus lors de l'envoi est le suivant :

    1. Déterminez si le téléphone est occupé, s'il y a une erreur directe "envoyé trop vite".

    2. Déterminez s'il existe. S'il existe, continuez à vérifier s'il est égal à 10. S'il existe et est égal à 10, une erreur "Vous ne pouvez pas envoyer de messages texte aujourd'hui" sera affichée. signalé

    3. Envoyer des SMS

    4. Écrire téléphone-occupé, valable 1 minute

    5. Écrivez phone-send-count+1, l'horodatage de 23:59:59 le jour de validité - l'horodatage actuel

    répondre
    0
  • PHPz

    PHPz2017-04-27 09:05:05

    Utilisez le numéro de téléphone portable + la minute et le numéro de téléphone portable + le jour comme clés pour limiter le nombre de SMS envoyés respectivement en une minute et un jour

    répondre
    0
  • 我想大声告诉你

    我想大声告诉你2017-04-27 09:05:05

    Maximum un message par minute, saisi par minute et numéro de téléphone :min:201701041750:13888888888
    Maximum 10 messages par jour, saisi par date et numéro de téléphone :day:20170104:13888888888

    //php demo
     function check($phone){
        if($redis->exists('min:'.date('YmdHi').':'.$phone) || $redis->get('day:'.date('YmdHi').':'.$phone) > 10){
           reutrn false;
        }
        $redis->set('min:'.date('YmdHi').':'.$phone,1);
        $redis->incr('day:'.date('Ymd').':'.$phone);
        return true;
    }
    // 这样按分钟生成的key比较多,可以把手机号对应的分钟放`set`内

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-27 09:05:05

    Écrivez un morceau de pseudo code comme suit :

    String sendFrequencyKeyPrefix = "send_frequency_";
    String dailySendLimitKeyPrefix = "daily_send_limit_";
    
    public function sendMessage(String phoneNumber, String message){
    
        if(redis.get((sendFrequencyKeyPrefix + phoneNumber))) {
            return false;
        }
        int dailySendTotal = int(redis.get((dailySendLimitKeyPrefix + phoneNumber)));
        if(dailySendTotal >= 10) {
            return false;
        }
        // send message here
        redis.set((sendFrequencyKeyPrefix + $phoneNumber), "", 60);
        redis.set((dailySendLimitKeyPrefix + $phoneNumber), dailySendTotal + 1, 3600*24);
        return true;
    }

    Voici ce que cela signifie. Vous pouvez définir la limite d'envoi pour une minute ou un jour sous forme de fichier de configuration, qui est flexible et modifiable.

    Révisé le 5 janvier

    Mon ami @Lowky ici présent m'a rappelé une question, à savoir si la limite quotidienne est d'un jour ou de 24 heures, car ces deux concepts sont différents. L'essentiel ici est qu'il y a une limite de 10 articles par jour et que la limite est libérée tôt le matin chaque jour. Tu devrais arrêter d'y penser à chaque minute. Le code est modifié comme suit :

    String sendFrequencyKeyPrefix = "send_frequency_";
    
    public function sendMessage(String phoneNumber, String message){
        String dailySendLimitKeyPrefix = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        if(redis.get((sendFrequencyKeyPrefix + phoneNumber))) {
            return false;
        }
        int dailySendTotal = int(redis.get((dailySendLimitKeyPrefix + phoneNumber)));
        if(dailySendTotal >= 10) {
            return false;
        }
        // send message here
        redis.set((sendFrequencyKeyPrefix + $phoneNumber), "", 60);
        redis.set((dailySendLimitKeyPrefix + $phoneNumber), dailySendTotal + 1, 3600*24);
        return true;
    }

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-27 09:05:05

    La première question peut être réalisée en réglant le délai d'expiration. Tant que le numéro de téléphone portable existe dans Redis, cela signifie qu'il ne fait pas 1 minute.
    La deuxième question est de changer le compteur à chaque fois. est envoyé et règle l'heure d'expiration du compteur sur un jour

    .

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-27 09:05:05

    Instructions simples :

    1. Vous avez besoin de deux clés

    2. Une clé qui expire dans 1 minute

    3. Une clé qui expire dans 24h

    Selon le business des SMS, le règlement se fait en fonction de la durée de validité et non à 0h.

    répondre
    0
  • Annulerrépondre