Redis 如何限制短信发送
迷茫
迷茫 2017-04-27 09:03:05
0
6
946

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

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

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

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

membalas semua(6)
漂亮男人

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

PHPzhong

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

我想大声告诉你

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`内
伊谢尔伦

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

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

左手右手慢动作

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan