シンプルなRedisのは、分散書いたロック[I]

私は、単純な分散ロック・Redisのを書きました

 

パッケージのRedis。

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

パブリック クラスRedisLock2 { 

    JedisPool jedisPool = 新しい JedisPool( "127.0.0.1"、6379 )。
    プライベート文字列のキー。
    プライベートString値。
    プライベートロングタイムアウト= 5L ;
    プライベートロングたstartTime; 
    
    公共RedisLock2(JedisPoolのjedis、文字列キー){
         スーパー()。
        この .jedisPool = jedisPool。
        この .KEY = キー。=のSystem.currentTimeMillis()+ "" 
    } 
    
    公共RedisLock2(JedisPoolのjedis、文字列キー、長いタイムアウト){
         スーパー()。
        この .jedisPool = jedis。
        この .KEY = キー。
        この .timeout = タイムアウト。 =のSystem.currentTimeMillis()+ "" 
    } 

    パブリック ブールロック(){ 
        Jedis jedis = jedisPool.getResource()。
        ブール OK = jedis.set(キー、値、 "NX"、 "EX"、タイムアウト)=!nullを
        jedis.close(); 
        もし(!{)OK
             // ロックが失敗した
            リターン falseにする; 
        } 
        // 成功したロックされ 
        たstartTime = にSystem.currentTimeMillis();
         を返す trueに; 
    } 
    
    パブリック文字列のUNLOCK(){ 
        文字列MSG = "" ;
         ロング timeConsume =にSystem.currentTimeMillis() - startTime;
         IF(timeConsume、> 1000 *タイムアウト){ 
            するSystem.out.println( "タイムアウトロック解除-----------キー:" + +キー"にMS:" + timeConsume);
 //             ; falseを返す 
            "に、MS:" +キー+:MSGは= "タイムアウトがロック解除--keyを発生します"+timeConsume;
             戻りMSG; 
        } 
        // ここでは、リリースは、同じ名前の他のスレッドロックアウト、タイムアウトを避けるためである
         // 問題がありますが、それは、次のコードでアトミック操作ではありません、無視され、ここで並行性の問題があるかもしれない 
        Jedis jedis = jedisPool。 getResource(); 
        文字列s = jedis.get(KEY);
         IF (value.equals(S)){
             // リリースロック
            jedis.del(KEY); 
            jedis.close(); 
//             trueに戻り、 
            MSG =「アンロック成功" ;
             戻りMSG; 
        } 
        jedis.close(); 
        System.out.printlnは( "その他の異常なキー失敗した---------:「+ キー)。
//         偽に戻り、 
        MSG = "他の異常失敗--key:" + キー、
         戻るMSG; 
    } 
    
    
    パブリック 静的 ボイド MAIN1(文字列[]引数)スローInterruptedExceptionある{ 
        JedisPool jedisPool = 新しい新 JedisPool( "127.0.0.1"を、 6379 );
         // jedis接続プールからオブジェクトを取得 
        = RedisLock2 redisLockを新しい新規 RedisLock2(jedisPool、 "LOCK1"、1Lに);
         ブールロック= redisLock.lock();
         IF (ロック){ 
            するSystem.out.println(「GET 「ロックする)。
            Thread.sleep(2000年); 
        } 
        のSystem.out.println(redisLock.unlock())。
    } 
    
    
    パブリック 静的 ボイドメイン(文字列[]引数){ 
        JedisPool jedisPool = 新しい JedisPool( "127.0.0.1"、6379 )。
        Jedis jedis2 = jedisPool.getResource()。
        
//         DistributedLockロック=新しいDistributedLock(jedisPool)。
        
        以下のためにint型 i = 0; iは<3; I ++ ){
 //             最終int型のK = I。
            新しいスレッド(新しいRunnableを(){ 
                @Override 
                公共 のボイド RUN(){
                     INT J = 0; J <10; J ++ ){
                         int型 K = J;
                         // ローカルサービスへの接続のRedis
 //                         Jedis Jedis新しい新=( "ローカルホスト")をjedis;
                         // 接続プールオブジェクトを作成します 
                        コード=文字列のNULL ;
                         試み{
                             //は、分散ロック追加
 //                             コード= Lock.lock( "mylockを"); 
                            RedisLock2 myLock = 新しい新しい RedisLock2(jedisPool、 "LOCK1"、10L);
                             一方、真の){
                                 // ロック獲得し続ける
                                ブールロック= myLock.lockを();
                                 IF (ロック){
                                     // 取得した実行た場合
                                     //は、接続プールからオブジェクトを取得jedis 
                                    Jedis jedis = jedisPool.getResource( );
                                     IF(!jedis.exists( "" + K)){ 
                                        jedis.set( "" + "" + K、60 K、にThread.currentThread()のgetName());
                                        jedis.expire(
                                        }); 
                                        System.out.println(のSystem.currentTimeMillis() + " - " + にThread.currentThread()のgetName()
                                                 + "--key:" +( "" + K)+「不存在、设置值为。 「+ にThread.currentThread()のgetName())。
                                        試す{
                                             // のThread.sleep((ロング)(Math.random()* 1000)); 
                                        } キャッチ(例外e){ 
                                            e.printStackTrace(); 
                                    } { 
                                        のSystem.out.println(にThread.currentThread()のgetName() + "--key:" +( "" + K)+ "が存在するが、ある:" 
                                                + jedis.get( "" + K )); 
                                    } 
                                    jedis.close(); 
                                    // エンドロック解除実行
                                    ; myLock.unlock()
                                     ブレーク ; // ループのうち
                                } 
                                
                            } 
                            
                        } 最後に{
                             //分散ロック解除
 //                             lock.unlock( "mylock"、コード); 
                        } 
                    } 
                } 
            })スタート(); 
        } 
    } 
    
    
}

 

おすすめ

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