并发下,使用redis防止数据重复插入(数据库未对表字段设置唯一情况下)
@Controller @RequestMapping("/myTest") public class TestController { @Autowired(required = false) private TestService testService; @Autowired private RedisUtil redisUtil; @RequestMapping("add") public void add(HttpServletRequest request) throws Exception { List<Course> cList = testService.queryByName("aaaaa");//查询 System.out.println(Thread.currentThread().getName()+"clist.size:"+cList.size()); if(cList.size() == 0){ if(redisUtil.setnx("name_"+"aaaaa", "aaaaa") == 1){//如果数据存在则返回0,不存在返回1 Course course = new Course(); course.setCname("aaaaa"); try{ testService.add1(course);//插入 }catch (Exception e) { redisUtil.del("name_"+"aaaaa");//插入出异常则删除 throw e; } System.out.println(Thread.currentThread().getName()+"success"); redisUtil.expire("name_"+"aaaaa", 3);//设失效时间3秒 }else{ System.out.println(Thread.currentThread().getName()+"exists"); } }else{ System.out.println(Thread.currentThread().getName()+"false"); } } }
RedisUtil 工具类可以网上搜
以下测试代码:
public class Test { /** * @param args * @throws IOException * @throws HttpException */ public static void main(String[] args) throws Exception { for(int i=0;i<10;i++){ try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub post(); } }).start(); } } public static void post(){ HttpClient client = new HttpClient(); client.getParams().setContentCharset("UTF-8"); PostMethod method = new PostMethod("http://localhost:8080/practice/myTest/add.do?time="+new Date().getTime()); method.setRequestHeader("ContentType","application/x-www-form-urlencoded;charset=UTF-8"); try { client.executeMethod(method); } catch (HttpException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。