cari

Rumah  >  Soal Jawab  >  teks badan

Redis 如何限制短信发送

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

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

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

迷茫迷茫2775 hari yang lalu952

membalas semua(6)saya akan balas

  • 漂亮男人

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

    Memerlukan dua cache

    1. nama kunci telefon sibuk, dicache selama 1 minit

    2. nama kunci phone-send-count, dicache selama 1 hari, +1 untuk setiap yang berjaya dihantar

    Proses semasa menghantar adalah seperti berikut:

    1. Tentukan sama ada telefon-sibuk wujud Jika terdapat ralat langsung "terlalu cepat".

    2. Tentukan sama ada kiraan penghantaran telefon wujud Jika ia wujud, teruskan periksa sama ada ia sama dengan 10. Jika ia wujud dan bersamaan dengan 10, ralat "Anda tidak boleh menghantar mesej teks hari ini" akan menjadi. dilaporkan

    3. Hantar SMS

    4. Tulis telefon-sibuk, sah selama 1 minit

    5. Tulis phone-send-count+1, cap masa 23:59:59 pada hari sah - cap masa semasa

    balas
    0
  • PHPz

    PHPz2017-04-27 09:05:05

    Gunakan nombor telefon bimbit + minit dan nombor telefon bimbit + hari sebagai kunci untuk mengehadkan bilangan mesej teks yang dihantar masing-masing dalam satu minit dan satu hari

    balas
    0
  • 我想大声告诉你

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

    Maksimum satu mesej seminit, dikunci mengikut minit dan nombor telefon:min:201701041750:13888888888
    Maksimum 10 mesej setiap hari, dikunci mengikut tarikh dan nombor telefon: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`内

    balas
    0
  • 伊谢尔伦

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

    Tulis sekeping kod pseudo seperti berikut:

    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;
    }

    Inilah maksudnya Anda boleh menetapkan had penghantaran selama satu minit atau satu hari sebagai fail konfigurasi, yang fleksibel dan boleh diubah.

    Disemak pada 5 Januari

    Rakan saya @Lowky di sini mengingatkan saya tentang satu soalan, iaitu sama ada had harian adalah satu hari atau 24 jam, kerana kedua-dua konsep ini berbeza. Perkara utama di sini ialah terdapat had 10 item setiap hari, dan had dikeluarkan pada awal pagi setiap hari. Anda harus berhenti memikirkan perkara ini setiap minit. Kod tersebut diubah suai seperti berikut:

    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;
    }

    balas
    0
  • PHP中文网

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

    Soalan pertama boleh dicapai dengan menetapkan masa tamat tempoh Selagi nombor telefon bimbit ada dalam Redis, bermakna belum sampai 1 minit
    Soalan kedua ialah menukar kaunter setiap kali dihantar dan tetapkan masa tamat kaunter Tetapkan kepada satu hari

    balas
    0
  • ringa_lee

    ringa_lee2017-04-27 09:05:05

    Arahan mudah:

    1. Anda memerlukan dua kunci

    2. Kunci yang tamat tempoh dalam masa 1 minit

    3. Kunci yang tamat tempoh dalam masa 24 jam

    Menurut perniagaan SMS, penyelesaian adalah berdasarkan tempoh sah dan bukan pada pukul 0.

    balas
    0
  • Batalbalas