当前位置: 代码迷 >> J2SE >> 对同一号码发送雷同的内容间隔不少于10分钟
  详细解决方案

对同一号码发送雷同的内容间隔不少于10分钟

热度:100   发布时间:2016-04-23 20:33:07.0
对同一号码发送相同的内容间隔不少于10分钟
这个是我做短信服务端遇到的问题,求思路啊!

------解决方案--------------------
看数据量呗,如果数据量较小,可以把发送的号码、内容和时间放在内存中做缓存,如果认为内容太长占用内存太多,可以考虑取hash值存储,10分钟没有发送则失效(可以用一个线程循环扫描)。如果数据量较大,则可以考虑建一个缓存表,工作原理与前面一样,只是把存放在内存中的存放在数据库中了。

不过一般10分钟应该不会有太多吧。如果小于几十万这种数量级,可以考虑放在内存中,这样性能会比较好。
------解决方案--------------------
定义一个集合表示不能被发送的号码。当要向一个号码发送的时候,查看这个集合中是否有这个号码,如果有就不发送,否则就发送,并且向这个集合添加这个号码,然后创建一个类,这个类存储这个号码,并且通过这个类启动定时器10分钟之后从集合中去除这个号码.
------解决方案--------------------
定义一个容器(根据实际数据量选择内存,数据库,文件等)

(号码+内容)做摘要(sh1,md5都可以)作为唯一标识(map的key,数据库中的主键等)

拿小数据量用map来说

var map(str,date);
var key = hash(num+mess);
var date=map.get(key);
if(date=null) send();
else if(nowDate-date > 10min) send(); map.put(key,nowDate);

------解决方案--------------------
简单的一个小例子



public static final Map<Integer, Long> cache = new HashMap<Integer, Long>();

public static void main(String[] args) {

String phone = "13xxxxxxxxx";
String msg = "xxxxxxxx";

StringBuilder builder = new StringBuilder();

Integer key = builder.append(phone).append(msg).hashCode();
if (cache.containsKey(key)) {
Long lastTime = cache.get(key);
if ((System.currentTimeMillis() - lastTime) < 600000) {
// TODO:
} else {
cache.remove(key);
}
} else {
cache.put(key, System.currentTimeMillis());
}

}