redis簡單的解決小併發方法

/**
     * 參與抽獎  下單
     */
    @RequestMapping(value="/participateInTreasure")
    public AppDataModel_Sec participateInTreasure(IntegralTreasureEntity integralTreasureEntity){
        AppDataModel k = null;
          try {    
              IntegralTreasureController con = new IntegralTreasureController();

              //執行分佈式鎖方法
            Long longtime = new Date().getTime(); //獲取當前時間,計算是否超時用,防止某一用戶佔用時間太長
              Jedis  jedis = new Jedis ("localhost",6379); 
              Long lock = jedis.setnx("usernames", longtime.toString());
              System.out.println(jedis.get("usernames"));
              if(lock <= 0){
                  System.out.println("有鎖了,等會");
                long chaoshi = Long.parseLong(jedis.get("usernames"));
                Long l = (long)(new Date().getTime() - chaoshi);
                System.out.println(l);
                if(l>2000){
                    jedis.del("usernames");
                    //去掉時間重新插入key
                    Long lock1 = jedis.setnx("usernames", longtime.toString());
                      if(lock1 > 0) {
                            //加鎖成功,開始執行方法體
                          System.out.println("執行方法體2="+integralTreasureEntity.getUserId());
                          k = integralTreasureService.addParticipateInTreasure(integralTreasureEntity);
                        }
                      jedis.del("usernames");  //執行結束幹掉這個key
                }else{
                    //未超時則返回網絡繁忙,請稍後重試
                    System.out.println("網絡繁忙,請稍後重試");
                    k=new AppDataModel();
                    k.setStatus(0);
                    k.setMessage("網絡繁忙,請稍後重試");
                }
              }else{
                  if(lock > 0) {//lock爲插入成功條數
                        //加鎖成功,開始執行方法體
                      System.out.println("執行方法體1="+integralTreasureEntity.getUserId());
                      k = integralTreasureService.addParticipateInTreasure(integralTreasureEntity);
                    }
                  jedis.del("usernames");  //執行結束幹掉這個key
              }

              
              
        } catch (Exception e) {
            e.printStackTrace();
            k=new AppDataModel();
            k.setStatus(0);
            k.setMessage("手慢了,您看中的獎品已經開獎啦!");
        }
          return getAppDataMode_sec().setData(encodeURI(k));
    }

//最簡單的方法,影響性能,併發特別大的慎用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章