发送频次限制
思路:在发送中,对手机号码发送次数判断,如:3天内超过3次,则不允许发送
实现:在发送中 加入判断方法frequencyCheck();,
1、先在发送结果表查询最近3天内的记录,如果单个手机号码记录=3,则返回true,设置为超频号码,不执行发送
缺陷:如果发送量大,几十万号码,每个号码做判断,每个号码都必须查询一次数据库,且发送结果表里的数据也有几百万,查出单个数据太慢
解决办法:用redis做手机频次缓存,发送时,依据手机号码从redis内存中获取频次次数,超过3次则返回true,设置为超频号码,不执行发送
进入超频判断
//限制号码校验、处理
if (frequencyControlHelper.checkMobileFrequency(channel.getId(),smsMmsChannel.getIdMms(),product.getMmsSign(),mobile)){
sendResult.setMobilevalid(6);
sendResult.setStatusCode("CX:0006");
sendResult.setStatusDesc("超频号码");
blackNum++;
continue;
}
获取设置的超频天数和次数,即n天限制k次
public boolean checkMobileFrequency(Long channelId,Long idMms,String mmsSign,String mobile){
//获取设置的n天k次超频限制
//并把配置的参数n天k次也缓存到redis中,则不需每次从数据库中获取
String mobileSendFrequency = sysConfigService.selectConfigByKey("mobileSendFrequency");
if (StringUtils.isBlank(mobileSendFrequency)){
log.warn("超频号码校验参数未设置:mobileSendFrequency");
return false;
}
JSonObject json = JSONObject.parseObject(mobileSendFrequency);
Date date = new Date();
//依据不同方式检查频次
boolean checkChannel = checkFrequencyOfChannel(json,date,channelId, mobile);
boolean checkTemplate = checkFrequencyOfTemplate(json,date,idMms, mobile);
boolean checkMmsSign = checkFrequencyOfMmsSign(json,date,mmsSign, mobile);
if (checkChannel||checkTemplate||checkMmsSign) {
return true;
}else {
return false;
}
}
public boolean checkFrequencyOfChannel(JSonObject sendFrequencyJson,Date date,Long channelId,String mobile){
//多少天限制
int days = sendFrequencyJson.getIntValue("channelDays");
//限制只能发多少次
int count = sendFrequencyJson.getIntValue("channelCount");
if (days ==0 || count == 0){
return false;
}
int dayOfYear = DateUtil.dayOfYear(date);
int frequency = dayOfYear / days;
//存储到redis的key
String key = "mobileSendFrequency:channel:"+channelId+"_"+frequency;
return checkFrequency(count,date,key,mobile);
}
public boolean checkFrequency(int count,Date date,String key,String mobile){
//List mobileList = (List) CacheUtils.get("mobileSendFrequency", "channel:"+channelId+";day:"+frequency);
//String key = "mobileSendFrequency:channel:"+channelId+"_"+frequency;
public List 


