Redis分布式ロックのsetnx,expire,deleteの使い方

2542 ワード

分散ロックを使用する理由は、主に、高同時性の場合のマルチスレッドの共有リソースへのアクセスを制御するためです.本文は主にRedis分布式ロックのいくつかのコマンドsetnx(key,value),expire(key,seconds),delete(key)を用いて簡単な「分布式ロック」を実現する方法を説明する.コンテンツ(1)まずRedisの依存性を追加する(本明細書ではSpring Bootと統合する).propertiesプロファイルは、ホスト番号やポート番号などの構成を行います.

    org.springframework.boot
    spring-boot-starter-redis
    1.3.5.RELEASE

spring.redis.host=127.0.0.1
spring.redis.port=6379

(2)カスタムインジェクションはRedisの操作コンポーネントに関するBean構成であり,ここでは主にカスタムインジェクション構成RedisTemplateとStringRedisTemplate操作コンポーネントである.
// redis      
@Configuration
public class RedisConfig {
    @Autowired
    private RedisConnectionFactory redisConnectionFactory;
 
    @Bean
    public RedisTemplate redisTemplate(){
        RedisTemplate redisTemplate=new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //TODO:  Key、Value      
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
 
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
 
    @Bean
    public StringRedisTemplate stringRedisTemplate(){
        StringRedisTemplate stringRedisTemplate=new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
        return stringRedisTemplate;
    }
}

(3)分散ロックの使用
ValueOperations valueOperations=stringRedisTemplate.opsForValue();
//key        id    id,       ;
//value       +   ;
String key = userId;
String value = RandomUtil.getAnyNum();
Boolean result=valueOperations.setIfAbsent(key,value);
if (result){
   stringRedisTemplate.expire(key,20, TimeUnit.SECONDS);
   try{
    	//      
   }catch(Exception e){
   		throw new Exception(".....");
   }finally{
   		//  “   ”   ,                         ,
   		//   ,   !                !
   		if (value.equals(valueOperations.get(key).toString())){
    		stringRedisTemplate.delete(key);
		}
   }
}

setnxとexpireの解釈:setIfAbsentは、setnxが最初にキャッシュにkey-valueが存在するかどうかを判断し、キャッシュが存在しない場合はキャッシュに追加してtrueを返します.この場合、ロックに期限切れが加算されます.ここでは20秒です.主に、サービスの再起動や異常によってロックが解放されなくなった後、ロックが解放されないことを避けるためです.つまり、20秒後にロックが解放されるかどうかにかかわらず自動的に期限が切れ、期限が切れなければキーがキャッシュに存在し続け、そのキーがユーザidを使用している場合、そのユーザは後期に関連する業務操作を行うことができなくなります.これはexpireの役割です.ロックを所定の時間に期限切れ操作することです.