判断一个小时之内是否重复发送了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" ""
相关推荐
主要为大家详细介绍了java发送短信系列之限制日发送次数,详细介绍了限制每日向同一个用户(根据手机号和ip判断)发送短信次数的方法,感兴趣的小伙伴们可以参考一下
2.3 发送短信,原型如下: long SMSSendMessage([in] String strContent, [in] String strDestNum) 参数,strContent:信息内容; strDestNum:目标号码; 返回值 0: 表示发送失败,具体失败原因参见 [ 3.1 发送...
jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器支持运行PHP和其它fastcgi应用程序,将Servlet容器充当成一个FastCGI 的网关。...
当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。 QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...
当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。 QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...
压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...
压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...
压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...
压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...
压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...
另外有只打开一个应用程序、CRichEdit的使用、最小到托盘、自动检测在线用户(多播组)等。 FreeBird2011Dlg.h 主对话框类头文件 MultiGroup.h 多播组类头文件 UserLink.h 用户链表类头文件 ListenSocket.h 侦听接口...
.NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎...
应用户强烈要求,时尚版具有商品批量添加功能,可自定义一次性添加的商品个数,可一次提交保存所有商品信息,抛弃单调、重复的工作,网趣时尚版新版脱颖而出,让您的管理工作更轻松,管理更方便! 十、订单自动...
应用户强烈要求,时尚版具有商品批量添加功能,可自定义一次性添加的商品个数,可一次提交保存所有商品信息,抛弃单调、重复的工作,网趣时尚版新版脱颖而出,让您的管理工作更轻松,管理更方便! 十、订单自动...
根据商城的设计原则,对于同一商品如果多次点购买分按一个商品购买多次计算,但用户选择的同一个商品,如果选择了不同颜色或尺码,这个问题就出现了,时尚版现已解决这个问题,同一商品选择不同颜色或尺码进行多次...
应用户强烈要求,时尚版具有商品批量添加功能,可自定义一次性添加的商品个数,可一次提交保存所有商品信息,抛弃单调、重复的工作,网趣时尚版新版脱颖而出,让您的管理工作更轻松,管理更方便! 十、订单自动...