判断一个小时之内是否重复发送了10次短信

并且是同一个手机

每次发送短信,要写入当前时间戳到redis:

String mobile="13718486139";
		String time=String.valueOf(DateTimeUtil.getCurrentMillisecond());
		RedisHelper.getInstance().saveKeyCache("limit_one_hour", mobile+"_"+time, time);

检查时先获取所有时间戳:

Map map=RedisHelper.getInstance().getAllKeyCache("limit_one_hour");

具体判断逻辑:

@Test
	public void test_limitOneHour2(){
		String mobile="13718486139";
		int limitCount=5;
		int limitTime=2*60;//两分钟
		Map<String,String> map=new HashMap<String,String>();
		map.put("13718486139_1445429819328", "1445431479437");
		map.put("13718486139_1445429874699", "1445431485996");
		map.put("13718486139_1445429874799", "1445431491527");
		map.put("13718486139_1445430757886", "1445431496853");

		System.out.println(map);
		List<Long>list=new ArrayList<Long>();
		for(String key:map.keySet()){
			if(key.startsWith(mobile)){
				list.add(Long.parseLong(map.get(key))/1000);
			}
		}
		SortList<Long>sortUtil=new SortList<Long>();
		sortUtil.Sort(list, "longValue", "desc");
		int length=list.size();
		int toIndex=0;//要截取的最大序号
		if(limitCount>length){
			toIndex=length;
		}else{
			toIndex=limitCount;
		}
		List<Long>result=list.subList(0, toIndex);
		long delter=list.get(0).longValue()-list.get(toIndex-1).longValue();
		long delterSecond=delter;
		System.out.println(delterSecond);
		if(delterSecond<limitTime){
			System.out.println("超限");
		}else{
			System.out.println("可以继续发短信");
		}
		System.out.println(result);
	}
	

步骤:

(1)把当前手机号的所有时间戳放入list中;

(2)对list排序,按时间顺序,从大到小;(时间越大,表示离现在越近)

(3)根据次数(limitCount)限制 来截取list;

(4)计算list中第一个元素和最后一个元素的差量,即limitCount条短信的时间跨度delter

(5)若delter 小于时间限制limitTime,则表示超过限制,那么禁止发送短信

问题

为什么要以这种方式存储到redis?

"limit_one_hour" "13718486139_1445429819328" "1445431496853"

而不是直接以手机号为key

13718486139  "1445431496853"  ""

因为:可能其他redis项是以手机号为key的,这样就会覆盖掉.即这样做有风险.

不过如下方式可以:

13718486139_limit_one_hour   "1445431496853"  ""

时间: 2024-10-29 19:12:09

判断一个小时之内是否重复发送了10次短信的相关文章

#2 判断一个字符串是否包含重复字符

「Google面试题」 [题目] 判断一个字符串是否包含重复字符.例如:“good”就包含重复字符‘o’,而“abc”就不包含重复字符 [题目分析] 对字符串进行遍历,统计每一个字符的个数,如果不为1则跳出遍历并返回True [解答] 1 #!/Users/minutesheep/.pyenv/shims/python 2 # -*- coding: utf-8 -*- 3 4 5 def isDup(strs): 6 ''' 7 判断字符串是否有重复字符 8 ''' 9 for ch in s

android 发送短信 如何做到一条一条的发送,只有在上一条发送成功之后才发送下一条短信

android发送短信截获上一条发送是否成功,然后再来发送下一条短信 1.问题:在项目中遇到如下要求:待发短信有N条,实现一条一条的发送并在上一条短信发送成功之后再来发送下一条. for(int i=0;i<3;i++){ sendSMS(10086, text1, i); } private void sendSMS(String toAddress, String body, Long id) { // ---sends an SMS message to another device---

thinkphp5 阿里云短信 发送多参数的短信

有的朋友用阿里oss的时候可能会发送多参数的短信, 例如短信模版是  您好${code1},收到您的联系方式${code2},您的地址为${code3},我们会尽快派送. 类似于这样的多参数模版,首先第一关,可能是参数过长,怎么办,直接去阿里申请售后就可以了,和他们反馈一下,然后他们会给你把字数限制解除,然后你就可以传递超过20个字的内容了. 这一步完事,下一步就是接入阿里oss了,首先下载阿里oss的 类包了,去阿里官网下载就可以了,我这里整合的是thinkphp5.下载完成后具体步骤如下 1

android 发送短信 怎样做到一条一条的发送,仅仅有在上一条发送成功之后才发送下一条短信

android发送短信截获上一条发送是否成功,然后再来发送下一条短信 1.问题:在项目中遇到例如以下要求:待发短信有N条,实现一条一条的发送并在上一条短信发送成功之后再来发送下一条. for(int i=0;i<3;i++){ sendSMS(10086, text1, i); } private void sendSMS(String toAddress, String body, Long id) { // ---sends an SMS message to another device-

4、下行短信发送WebService、下行短信发送服务 -功能详细设计 --短信平台

3.  下行短信发送WebService 开发一个WebService,供第三方系统调用,用于发送短信.WebService接收数据后,将信息存储入数据库的短信发送数据表中. WebService参数包括:应用标识.手机号码(字符串数组类型).短信内容.扩展码(3-8位数字).优先级(数字1至5).定时发送时间(可null为即时发送).发送人ID(内部机构人员管理系统的ID).发送人全路径. 同时开发另一个WebService,与原有旧系统接口完全相同,用于调用旧短信平台的第三方系统无缝切换到新

发送指内容的短信

#import "ViewController.h" #import <MessageUI/MessageUI.h> @interface ViewController ()<MFMessageComposeViewControllerDelegate> @end @implementation ViewController - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIE

有1千万条有重复的短信,以文本文件的形式保存,一行一条,也有重复,用5分钟时间找出重复出现最多的前10条短信。

1,哈希表法 分成若干组,进行扫描.相同记录只加1次,重复次数加1,之后进行第二次扫描,得出重复次数的前十名. 2,从小到大排序(我觉得最好不用这种方法,准确性不高) 3,内存映射(建议) 对每条短信的第i个字母按ASCII码进行分组,也就是创建树.i是树的深度,也是短信的第i个字母.

zabbix 设置一定时间内重复发送报警

默认的步骤是1-3,也即是从1开始到3结束.一旦故障发生,就是执行sendEmail.sh脚本发生报警邮件给zabbix用户和zabbix administrator组. 假如故障持续了1个小时,它也只发送3次,第1-3次(即前3次)邮箱发送给zabbix用户,时间间隔为0秒.如果改成1-0,0是表示不限制.无限发送 间隔就是默认持续时间60秒.那么一个小时,就会发送60封邮件. 如果需要短信报警的话,可以再创建一条新的动作,选择短信脚本. 也可以在添加新的"操作",比如上面前3次报警

Android学习--写一个发送短信的apk,注意布局文件的处理过程!!!

刚开始写Android程序如图发现使用了findViewById方法之后输出的话居然是null(空指针错误),也就是说这个方法没有成功.网上说这样写是在activity_main .xml去找这个ID所代表的控件,而现在使用的ADT在layout下除了activity_main .xml还多生成了一个fragment_main.xml.我就是把控件写在了后一个布局文件中.想请问下,使用什么样的方法是在fragment_main.xml去寻找控件呢? 回答:在PlaceHolderFragment