国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Redis 如何限制短信發(fā)送
迷茫
迷茫 2017-04-27 09:03:05
0
6
1107

暫時(shí)不考慮 ip,什么的限制,只考慮 手機(jī)號(hào)限制,

如何用redis做到限制,一個(gè)手機(jī)號(hào),1分鐘內(nèi)最多發(fā)一條,一天內(nèi)最多10條

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

迷茫
迷茫

業(yè)精于勤,荒于嬉;行成于思,毀于隨。

全部回復(fù)(6)
漂亮男人

需要兩個(gè)緩存

  1. key名稱 phone-busy,緩存1分鐘

  2. key名稱 phone-send-count,緩存1天,每成功發(fā)送一條+1

發(fā)送的時(shí)候流程如下:

  1. 判斷phone-busy是否存在,存在直接報(bào)錯(cuò)“發(fā)送過(guò)快”。

  2. 判斷phone-send-count是否存在,存在則繼續(xù)檢測(cè)是否等于10,存在且等于10報(bào)錯(cuò)“您今天不能發(fā)送短信了”

  3. 發(fā)送短信

  4. 寫入phone-busy,有效期1分鐘

  5. 寫入phone-send-count+1,有效期當(dāng)天23:59:59的時(shí)間戳-當(dāng)前時(shí)間戳

PHPzhong

用手機(jī)號(hào)+分鐘,手機(jī)號(hào)+天做為key分別限制一分鐘和一天內(nèi)發(fā)送短信的數(shù)量

我想大聲告訴你

1分鐘內(nèi)最多發(fā)一條,用分鐘和手機(jī)號(hào)為key:min:201701041750:13888888888
一天內(nèi)最多10條,用日期和手機(jī)號(hào)號(hào)為key: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比較多,可以把手機(jī)號(hào)對(duì)應(yīng)的分鐘放`set`內(nèi)
伊謝爾倫

寫一段偽代碼如下:

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

大概意思就是這樣了,可以將一分鐘,一天的發(fā)送限制做成配置文件,靈活多變。

1月5日修改;

這里@Lowky 朋友提醒了一個(gè)問(wèn)題,就是每天這個(gè)限制,到底是一天還是24小時(shí),因?yàn)檫@兩個(gè)概念是不一樣的。這里樓主要的應(yīng)該是每天限制10條,每天凌晨限制放開。每分鐘應(yīng)該就不考慮這個(gè)了。code修改如下:

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

第一個(gè)問(wèn)題,設(shè)置過(guò)期時(shí)間就可以實(shí)現(xiàn)了,只要手機(jī)號(hào)存在于Redis,就是說(shuō)明沒(méi)到1分鐘
第二個(gè)問(wèn)題,每次發(fā)送的時(shí)候更改一下計(jì)數(shù)器,將計(jì)數(shù)器過(guò)期時(shí)間設(shè)為一天

左手右手慢動(dòng)作

簡(jiǎn)單說(shuō)明:

  1. 你要有兩個(gè)key

  2. 一個(gè)1分鐘過(guò)期的key

  3. 一個(gè)24h過(guò)期的key

按照短信業(yè)務(wù)來(lái)處理,都是按照有效時(shí)長(zhǎng),不按照0點(diǎn)結(jié)算。

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板