栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

项目记录-手机号码限制频次

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

项目记录-手机号码限制频次

发送频次限制

思路:在发送中,对手机号码发送次数判断,如: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 lGet(String key, long start, long end) {
        try {
            return redisTemplate.opsForList().range(key, start, end);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
*/
         //依据key在redis中查找,从0开始,到-1结束,即所有list数据
        List mobileList = redisUtils.lGet(key, 0, -1);
        //为空,第一次记录限制频次
        if (mobileList == null){
            mobileList = new ArrayList<>();
        }

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DATE, count);
        for (int i = 1; i <= count; i++) {
            String mobileCount = mobile+"_"+i;
            //如果设置频次限制为3天1次,已经有了记录有后又修改设置成3天3次
            int index = mobileList.indexOf(mobileCount);
            //为空时index为-1
            if (index>-1){
                if (i 

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号