<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 110, comments - 101, trackbacks - 0, articles - 7
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    redis 設置分布式鎖

    Posted on 2014-01-15 19:00 云云 閱讀(13412) 評論(1)  編輯  收藏
    public static boolean acquireLock(String lock) {
        // 1. 通過SETNX試圖獲取一個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成功,則成功獲取一個鎖
        if (acquired == 1)      
            success = true;
        //SETNX失敗,說明鎖仍然被其他對象保持,檢查其是否已經超時
        else {
            long oldValue = Long.valueOf(jedis.get(lock));
     
            //超時
            if (oldValue < System.currentTimeMillis()) {
                String getValue = jedis.getSet(lock, String.valueOf(value));              
                // 獲取鎖成功
                if (Long.valueOf(getValue) == oldValue)
                    success = true;
                // 已被其他進程捷足先登了
                else
                    success = false;
            }
            //未超時,則直接返回失敗
            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;
                    }
             });
    }





    評論

    # re: redis 設置分布式鎖   回復  更多評論   

    2016-04-20 15:04 by 小新人
    請問expired如何設置

    只有注冊用戶登錄后才能發表評論。


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 亚洲爆乳精品无码一区二区| 亚洲中文字幕无码一区| 日韩精品亚洲人成在线观看| 91av免费在线视频| 亚洲精品97久久中文字幕无码| MM1313亚洲精品无码久久| 久久久久免费看黄A片APP| 亚洲国产成人超福利久久精品| 无码精品一区二区三区免费视频| 亚洲av午夜福利精品一区| 久久伊人免费视频| 亚洲天天做日日做天天欢毛片| 四虎影视在线影院在线观看免费视频 | 免费v片在线观看品善网| 日韩色日韩视频亚洲网站| 亚洲福利在线播放| 一区二区免费电影| 亚洲精品美女久久777777| a毛片视频免费观看影院| 久久亚洲精品无码AV红樱桃| 4虎永免费最新永久免费地址| 亚洲熟妇AV一区二区三区宅男| 国产乱子伦精品免费女| 黄色视频在线免费观看| 亚洲综合婷婷久久| 免费看国产成年无码AV片| 立即播放免费毛片一级| 亚洲国产精品久久久天堂| 成人免费福利视频| 亚洲暴爽av人人爽日日碰| 国产成人亚洲精品影院| 99国产精品免费观看视频| 亚洲va乱码一区二区三区| 又粗又硬又大又爽免费视频播放| 国产精品无码免费专区午夜| 亚洲美免无码中文字幕在线| 国产网站在线免费观看| 免费观看成人久久网免费观看| 狠狠色伊人亚洲综合网站色| 亚洲欧洲中文日韩久久AV乱码| 曰批全过程免费视频播放网站|