redis分布式锁

import  org.springframework.data.redis.core.RedisTemplate;
import  org.springframework.data.redis.core.script.DefaultRedisScript;
import  java.util.Collections;
import  java.util.concurrent.TimeUnit;

public  class  DistributedLock  {   
    private  final  RedisTemplate < String,  String > redisTemplate;   
    private  final  String  lockKey;   
    private  final  String  lockValue;   
    private  final long expireTime;   
    public  DistributedLock(RedisTemplate < String,  String > redisTemplate,                String  lockKey, long expireTime) {     
        this.redisTemplate  = redisTemplate;     
        this.lockKey  = lockKey;     
        this.lockValue  =  UUID.randomUUID().toString();     
        this.expireTime  = expireTime;  
    }   
    
    public  boolean  tryLock() {     
        Boolean  acquired = redisTemplate.opsForValue()      .setIfAbsent(lockKey, lockValue, expireTime,  TimeUnit.MILLISECONDS);     
        return  Boolean.TRUE.equals(acquired);  
    }   

    public  void  unlock() {     
        String  script =  "if redis.call('get', KEYS[1]) == ARGV[1] then "  +              "return redis.call('del', KEYS[1]) "  +              "else return 0 end";    
        redisTemplate.execute(       new  DefaultRedisScript < > (script,  Long.class),        Collections.singletonList(lockKey),       lockValue    );  
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容