Redisの練習[私はロックを分散]

 

パッケージのRedis; 

インポートredis.clients.jedis.Jedis;
 インポートredis.clients.jedis.JedisPool、

パブリック クラスRedisLock { 

    公共 静的 ボイドメイン(文字列[]引数){ 
        
        JedisPool jedisPool = 新しい新 JedisPool( "127.0.0.1"、6379 ) ;
         // 接続プールから取得jedisオブジェクト 
        jedis jedis = jedisPool.getResource(); 
        
        // ロック方式を分散シンプルな和Redisの
        ブール =ロックfalseに
        文字列のキー = "mylock" ; 
        String値 =にSystem.currentTimeMillis() + "" ;
        
        試し{
             // 50秒に自動的にロック解除された 
            文字列setResult = jedis.set(キー、値、 "NX"、 "EX"、50L );
             ロングたstartTime = 0 ;
             IF(setResult =!ヌル){ 
                ロック = trueに
                startTimeのは = システム.currentTimeMillis(); 
            } 
            
            // ロックを取得しない、終了
            IF(!ロック){
                 リターン; 
            } 
            
            // この時点までの実行は、それがロックする買収したことを説明し 
             、//         doSth 
            
            ロング = endTimeのをSystem.currentTimeMillis();
             // タイムアウトがロックを解除した場合
            IF((endTimeは-のstartTime)> 5000 ){
                 // ログを印刷 
                するSystem.out.printlnを( "タイムアウトロック解除-----------キー:" + キー); 
            } 
            
        } キャッチ(例外E){ 
            e.printStackTrace(); 
        } 最後に{
             // これはタイムアウトを回避するためである、ロックが他のスレッドの同じ名前の外に放出される
             // 問題がある、次のコードはアトミックではありません操作は、問題ここで省略することができる 
            文字列S = (KEY)jedis.get;
             IF (value.equals(S)){
                 // リリースロック
                 jedis.del(キー)。
            } 
        } 
        
        
        
        
        
        
        
        
        
        
        
    } 
}

 

 

 

 

パッケージのRedis。

輸入java.util.HashMapを;
輸入java.util.Map; 

輸入redis.clients.jedis.Jedis。
輸入redis.clients.jedis.JedisPool。

パブリック クラスRedisReentrantLock { 

    
    プライベートのThreadLocal <地図<文字列、整数>>ロッカー=   新しいのThreadLocal <> ();
    プライベートJedis jedis。
    
    公共RedisReentrantLock(Jedisのjedis){
         スーパー()。
        これは =の.jedis jedisを。
    } 

    プライベート ブール_lock(文字列キー){
         リターンjedis.set(キー、 ""、 "NX"、 "EX"、5L)=!nullを
    } 
    
    プライベート ボイド_UNLOCK(文字列キー){ 
        jedis.del(キー)。
    } 
    
    プライベートマップ<文字列、整数> currentLockers(){ 
        地図 <文字列、整数>参考文献= lockers.get()。
        もし(!レフリー= ヌル){
             戻りレフリー。
        } 
        lockers.set(新しい HashMapの<文字列、整数> ());
        戻るlockers.get(); 
    } 
    
    パブリック ブールロック(文字列キー){ 
        地図<文字列、整数>参考文献の=のcurrentLockers()。
        整数REFCNT = refs.get(キー)。
        もし(!REFCNT = ヌル){ 
            refs.put(キー、REFCNT 1 )。
            返す ; 
        } 
        ブール OK = この._lock(キー)。
        もし(!{OK)
             を返す 
        } 
        
        refs.put(キー 1 )。
        返す ; 
    } 
    
    パブリック ブールアンロック(文字列キー){ 
        地図<文字列、整数>参考文献の=のcurrentLockers()。
        整数REFCNT = refs.get(キー)。
        もし(REFCNT == NULL ){
             戻り 
        } 
        REFCNT - = 1 ;
        もし(REFCNT> 0 ){ 
            refs.put(キー、REFCNT)。
        } { 
            refs.remove(キー)。
            この._unlock(キー); 
        } 
        を返す 
    } 
    
    
    パブリック 静的 ボイドメイン(文字列[]引数){ 
        JedisPool jedisPool= 新しい JedisPool( "127.0.0.1"、6379 );
        // 从连接池中获取一个jedis对象 
        Jedis jedis = jedisPool.getResource()。
        RedisReentrantLock redisLock = 新しいRedisReentrantLock(jedis)。
        System.out.println(redisLock.lock( "LOCK1" )); 
        System.out.println(redisLock.lock( "LOCK1" )); 
        System.out.println(redisLock.unlock( "LOCK1" )); 
        System.out.println(redisLock.unlock( "LOCK1" )); 
    } 
    
}

 

おすすめ

転載: www.cnblogs.com/libin6505/p/11284413.html