redis setNX 锁来实现防止重复提交的
2017-07-07 10:29
218 查看
实现重复提交方式有很多种类,这里仅仅写一个用redis来防止重复提交的方式.redis是单进程单线程的
我们是利用setNX来实现用户在执行完成指定业务逻辑之后,才可以在再次执行该业务逻辑
RedisConnection redis=redisTemplate.getConnectionFactory().getConnection();
//获取当前时间
Date currentTime=new Date();
Calendar c=Calendar.getInstance();
c.setTime(currentTime);
c.add(Calendar.MINUTE, 10);
//setNX如果这个KEY存在那个为TURE否者为false,我们把这个键的值设置为当时的时间加上10分钟,这样如果下次请求如果发现Value的值大于当前时间10分钟
//,那么我们可以用getSet重新设定新的锁.
//redis是单进程单线程的
if(!redis.setNX((String.valueOf(asdf)+"_investment").getBytes(), (String.valueOf(c.getTimeInMillis())).getBytes())){
byte [] value= redis.get((String.valueOf(asdf)+"_investment").getBytes());
Date valueTimeOut= new Date(Long.parseLong(new String (value)));//获得锁过期时间
if(currentTime.compareTo(valueTimeOut)>0){//锁已经过期
//重新设置新的锁
redis.getSet((String.valueOf(asdf)+"_investment").getBytes(),(String.valueOf(c.getTimeInMillis())).getBytes());
}else{
return "REAPAT_SUBMIT";
}
}
//开始执行投资逻辑
// Object investBus= pjp.proceed();//投资逻辑
System.out.println("开始所谓的投资逻辑");
redis.del((String.valueOf(asdf)+"_investment").getBytes());
redis.close();
我们是利用setNX来实现用户在执行完成指定业务逻辑之后,才可以在再次执行该业务逻辑
RedisConnection redis=redisTemplate.getConnectionFactory().getConnection();
//获取当前时间
Date currentTime=new Date();
Calendar c=Calendar.getInstance();
c.setTime(currentTime);
c.add(Calendar.MINUTE, 10);
//setNX如果这个KEY存在那个为TURE否者为false,我们把这个键的值设置为当时的时间加上10分钟,这样如果下次请求如果发现Value的值大于当前时间10分钟
//,那么我们可以用getSet重新设定新的锁.
//redis是单进程单线程的
if(!redis.setNX((String.valueOf(asdf)+"_investment").getBytes(), (String.valueOf(c.getTimeInMillis())).getBytes())){
byte [] value= redis.get((String.valueOf(asdf)+"_investment").getBytes());
Date valueTimeOut= new Date(Long.parseLong(new String (value)));//获得锁过期时间
if(currentTime.compareTo(valueTimeOut)>0){//锁已经过期
//重新设置新的锁
redis.getSet((String.valueOf(asdf)+"_investment").getBytes(),(String.valueOf(c.getTimeInMillis())).getBytes());
}else{
return "REAPAT_SUBMIT";
}
}
//开始执行投资逻辑
// Object investBus= pjp.proceed();//投资逻辑
System.out.println("开始所谓的投资逻辑");
redis.del((String.valueOf(asdf)+"_investment").getBytes());
redis.close();
相关文章推荐
- jsp防止页面刷新重复提交--Struts令牌实现
- springmvc中自己实现的token防表单重复提交,防止二次提交
- springmvc中自己实现的token防表单重复提交,防止二次提交
- Spring MVC拦截器+注解方式实现防止表单重复提交
- Asp.net实现弹出窗口提示,又防止刷新被重复提交的方法
- Asp.net实现弹出窗口提示,又防止刷新被重复提交的方法
- Spring MVC拦截器+注解方式实现防止表单重复提交
- 服务器端防止重复提交的一个实现
- Spring MVC拦截器+注解方式实现防止表单重复提交
- 使用Post/Redirect/Get实现Asp.net防止表单重复提交
- java web项目防止表单重复提交的实现方案
- [转]防止表单重复提交的实现方法!
- Spring MVC拦截器+注解方式实现防止表单重复提交
- Asp.net实现弹出窗口提示,又防止刷新被重复提交的方法
- 使用struts2拦截器实现防止表单数据重复提交
- Spring MVC拦截器+注解方式实现防止表单重复提交
- JS 实现防止重复提交按钮
- Spring MVC拦截器+注解方式实现防止表单重复提交
- 前台限制默认表单重复提交(jquery 实现方式 防止因为网络延迟而产生的表单重复提交)
- Spring MVC拦截器+注解方式实现防止表单重复提交