美文网首页
Redis分布式锁

Redis分布式锁

作者: 谁家的猪 | 来源:发表于2019-07-14 09:56 被阅读0次

RedisLock

自己实现一个Redis分布式锁

import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.concurrent.TimeUnit;

/**
 * @author lijiayin
 */
public class RedisLock {
    
    private static final String REDIS_LOCK_KEY_PREFIX = "redis_lock_";
    
    private static StringRedisTemplate redisTemplate;
    
    static {
        redisTemplate = SpringContextHolder.getBean(StringRedisTemplate.class);
    }
    
    @SuppressWarnings("all")
    public static boolean lock(String key, Long duration){
        key = REDIS_LOCK_KEY_PREFIX + key;
        Boolean success = redisTemplate.opsForValue().setIfAbsent(key, 
                String.valueOf(System.currentTimeMillis() + duration));
        if(success){
            redisTemplate.expire(key, duration, TimeUnit.MILLISECONDS);
        } else {
            String oldValue = redisTemplate.opsForValue().get(key);
            if(StringUtils.isBlank(oldValue) || System.currentTimeMillis() > Long.valueOf(oldValue)){
                String result = redisTemplate.opsForValue().getAndSet(key, 
                        String.valueOf(System.currentTimeMillis() + duration));
                if(StringUtils.isBlank(result) || (StringUtils.isNotBlank(result) && StringUtils.equals(oldValue, result))){
                    redisTemplate.expire(key, duration, TimeUnit.MILLISECONDS);
                    success = true;
                }
            }
        }
        return success;
    }
    
    @SuppressWarnings("all")
    public static boolean unlock(String key){
        key = REDIS_LOCK_KEY_PREFIX + key;
        return redisTemplate.delete(key);
    }
}

SpringContextHolder

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @author lijiayin
 */
@Component
public class SpringContextHolder implements ApplicationContextAware {
    
    private static ApplicationContext applicationContext;
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextHolder.applicationContext = applicationContext;
    }
    
    @SuppressWarnings("all")
    public static <T> T getBean(String beanName){
        return (T)applicationContext.getBean(beanName);
    } 
    
    public static <T> T getBean(Class<T> clazz){
        return applicationContext.getBean(clazz);
    }
    
    public static <T> T getBean(String beanName, Class<T> clazz){
        return applicationContext.getBean(beanName, clazz);
    }
}

相关文章

网友评论

      本文标题:Redis分布式锁

      本文链接:https://www.haomeiwen.com/subject/dtfbhctx.html