パッケージの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" )); } }