我的Java路上那些事兒

          快樂(lè)成長(zhǎng)
          posts - 110, comments - 101, trackbacks - 0, articles - 7
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          redis 設(shè)置分布式鎖

          Posted on 2014-01-15 19:00 云云 閱讀(13409) 評(píng)論(1)  編輯  收藏
          public static boolean acquireLock(String lock) {
              // 1. 通過(guò)SETNX試圖獲取一個(gè)lock
              boolean success = false;
              Jedis jedis = pool.getResource();      
              long value = System.currentTimeMillis() + expired + 1;    
              System.out.println(value);    
              long acquired = jedis.setnx(lock, String.valueOf(value));
              //SETNX成功,則成功獲取一個(gè)鎖
              if (acquired == 1)      
                  success = true;
              //SETNX失敗,說(shuō)明鎖仍然被其他對(duì)象保持,檢查其是否已經(jīng)超時(shí)
              else {
                  long oldValue = Long.valueOf(jedis.get(lock));
           
                  //超時(shí)
                  if (oldValue < System.currentTimeMillis()) {
                      String getValue = jedis.getSet(lock, String.valueOf(value));              
                      // 獲取鎖成功
                      if (Long.valueOf(getValue) == oldValue)
                          success = true;
                      // 已被其他進(jìn)程捷足先登了
                      else
                          success = false;
                  }
                  //未超時(shí),則直接返回失敗
                  else            
                      success = false;
              }        
              pool.returnResource(jedis);
              return success;      
          }
           
          //釋放鎖
          public static void releaseLock(String lock) {
              Jedis jedis = pool.getResource();      
              long current = System.currentTimeMillis();      
              // 避免刪除非自己獲取得到的鎖
              if (current < Long.valueOf(jedis.get(lock)))
                  jedis.del(lock);      
              pool.returnResource(jedis);
          }



          //--------------------------

          public Long acquireLock(final String lockName,final long expire){
              return redisTemplate.execute(new RedisCallback<Long>() {
               public Long doInRedis(RedisConnection connection) {
                  byte[] lockBytes = redisTemplate.getStringSerializer().serialize(lockName);
          boolean locked = connection.setNX(lockBytes, lockBytes);
          connection.expire(lockBytes, expire);
          if(locked){
          return 1L;
          }
                      return 0L;
          }
          });
          }


          //原子操作 -----------------------

          public String getAndSet(final String key,final String value){
          return redisTemplate.execute(new RedisCallback<String>() {
          @Override
          public String doInRedis(RedisConnection connection)
          throws DataAccessException {
          byte[] result = connection.getSet(redisTemplate.getStringSerializer().serialize(key),
          redisTemplate.getStringSerializer().serialize(value));
          if(result!=null){
                                              return new String(result);
           }
          return null;
                          }
                   });
          }





          評(píng)論

          # re: redis 設(shè)置分布式鎖   回復(fù)  更多評(píng)論   

          2016-04-20 15:04 by 小新人
          請(qǐng)問(wèn)expired如何設(shè)置

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 凌源市| 潼南县| 南部县| 锡林郭勒盟| 突泉县| 班戈县| 五莲县| 白河县| 九台市| 阳东县| 绥江县| 齐齐哈尔市| 自治县| 吴江市| 固镇县| 虞城县| 沙洋县| 安岳县| 大埔县| 江安县| 云南省| 渭南市| 五家渠市| 灵石县| 伽师县| 巴青县| 浪卡子县| 柞水县| 鄢陵县| 西青区| 黄冈市| 囊谦县| 蒙阴县| 泸水县| 苏州市| 永城市| 兰坪| 鸡西市| 南雄市| 高台县| 南投县|