韩震博客|关注于学习java&php与交流

基于redis setnx命令的分布式锁

admin 2017年10月31日 Java知识 820 0
Java代码  
public class SoaLockSupport {  
  
    private Logger logger = Logger.getLogger(SoaLockSupport.class);  
          
        //你的redis实现类  
    private RedisAAA redis;  
  
    // 超时时间  
    private long timeout = 3000;  
      
    /** 
     * 获得锁,如果没拿到,会在超时时间内一直等待 
     */  
    public boolean lock(final String key) {  
        FutureTask<Boolean> future = new FutureTask<Boolean>(new Callable<Boolean>() {  
            public Boolean call() {  
                boolean nx = false;  
                for (;;) {  
                    nx = setnx(key);  
                    if(nx){  
                        break;  
                    }  
                    try {  
                        // 获取不到暂停2ms  
                        Thread.sleep(2);  
                    } catch (InterruptedException e) {  
                        //  
                    }  
                }  
                return nx;  
            }  
        });  
        try {  
            return future.get(timeout, TimeUnit.MILLISECONDS);  
        } catch (Exception e) {  
            logger.error("try lock error,key = "+key, e);  
        }  
          
        return false;  
    }  
  
    /** 
     * 尝试获得锁,如果没拿到,直接返回失败 
     */  
    public boolean trylock(String key) {  
        if (setnx(key)) {  
            return true;  
        }  
  
        // 做这一步是防止key一直不被Delete,导致锁一直得不到释放的问题  
        String oldTime = redis.getString(key);  
        if (oldTime != null && !oldTime.equals("")) {  
            long time = Long.valueOf(oldTime) + timeout;  
            long now  = System.currentTimeMillis();  
              
            if (time < now) {  
                logger.info("time = "+time + ",and now="+now);  
                redis.delete(key);  
                return setnx(key);  
            }  
        }  
        return false;  
    }  
  
    /** 
     * 释放锁 
     */  
    public void unlock(String key) {  
        redis.delete(key);  
    }  
  
    private boolean setnx(String key) {  
        if (redis.setnx(key, System.currentTimeMillis() + "") == 1) {  
            return true;  
        }  
        return false;  
    }


值得一看的IT学习资讯类网站!http://hongsehuoxian.com
看到这里如果这篇文章真的帮到你了,不妨打赏一下哦!

以上就是红色火线JAVA加油站整理的关于基于redis setnx命令的分布式锁的文章,
希望可以帮到你,如果你有不同的见解可以留言指正哦,避免让别的java小伙伴在走挫折路。
Nginx配置
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

分享:

支付宝

微信