私は、単純な分散ロック・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"、コード); } } } })スタート(); } } }