-java達成のためのRedisの分散ロック

パッケージcom.sea.report.forms.product.config.redis; 

インポートredis.clients.jedis.Jedis;
 インポートredis.clients.jedis.params.SetParams; 

インポートjava.util.Collections; 

/ ** 
 * @Classname RedisLockUtil 
 *少なくとも@description我々はそれが4つの条件を満たしていることを確認したい:
 * 1。相互に排他的:任意の時点で、1つのクライアントだけがロックを保持することができ
 、クライアントのサポートがあっても:* 2.デッドロックが発生しませんアクティブな崩壊はロックを解除しない、だけでなく、他の後続時のロックを確認するために
 ロックすることができます*クライアントを
 トレラント3に*障害を:ノードRedisの通常の操作のほとんどは、クライアントがロックし、ロックを解除することができます限り
 * 4.ロックをそしてクライアントとのロックを解除する必要があります
 * @date 2019年8月13日14時10 
 caibixiangによって@Created * 
 * / 
パブリック クラスRedisLockUtil {
     公共の 静的な 最終文字列LOCK_SUCCESS =「OK」;
     プライベート 静的 最終長いRELEASE_SUCCESS = 1L ; 

    / ** 
     * @param lockKeyロック
     * @param requestId要求識別子
     * @param expireTime有効期限
     * @return かどうかを取得成功
      * / 
    パブリック 静的 ブールのtryLock(lockKey文字列、文字列requestId、int型expireTime ){ 
        jedis jedis = RedisClient.getJedisPoool()のgetResource();. 
        SETPARAMSを有するSETPARAMS = SetParams.setParams()PX(expireTime).nx(); 
        文字列結果 =jedis.set(lockKey、requestId、SETPARAMS)。
        もし(LOCK_SUCCESS.equals(結果))
             リターン 返す ; 
    } 


    / ** 
     *用LUA脚本保证一致性
     * @param lockKey 
     * @param requestId 
     * @return 
     * / 
    パブリック 静的 ブールreleaseLock(文字列lockKey、列requestId){ 
        文字列のスクリプト =「もしredis.call( '取得'、KEYS [1])ARGV [1]次に、 'デル'(redis.call戻り== KEYS [1])他戻り0終了」
        Jedis jedis =。RedisClient.getJedisPoool()のgetResource(); 
        オブジェクトの結果 = jedis.eval(スクリプト、Collections.singletonList(lockKey)、Collections.singletonList(requestId))
         であれば(RELEASE_SUCCESS.equals(結果))
             を返す 返す ; 
    } 


}
パッケージcom.sea.report.forms.product.config.redis。

輸入com.sea.report.forms.product.dto.PersonDto;
輸入com.sea.report.forms.product.util.MapToObject。
輸入org.springframework.stereotype.Component。
輸入redis.clients.jedis.Jedis。
輸入redis.clients.jedis.JedisPool。
輸入redis.clients.jedis.JedisPoolConfig。

輸入java.util.Map; 

/ ** 
 * @Classname RedisClient 
 * @descriptionは、クライアントjedis 
 * @Date 2019年8月11日11:18 
 * caibixiangによって@Created 
 * / 
@Component 
パブリック クラスRedisClient { 
    

    公共の 静的JedisPool getJedisPoool(){ 
        JedisPoolConfig jedisPoolConfig = 新しいJedisPoolConfig()。
        jedisPoolConfig.setMaxTotal( 10 )。
        jedisPoolConfig.setMaxIdle( 10 )。
        jedisPoolConfig.setMinIdle( 10 )。
        jedisPoolConfig.setMaxWaitMillis( 1000年); 
        JedisPool jedisPool = 新しい JedisPool(jedisPoolConfig、 "IP"、6379 );
        返すjedisPoolを。
    } 


}

 

おすすめ

転載: www.cnblogs.com/caibixiang123/p/11347159.html