redis 分布式锁 另一种实现

/**
    *   deadLine  失效时间,比如当前时间+10s
    */
    public boolean lock(String lock,long deadLine) {
        Boolean key = false;
        try {
            key = jimClient.setNX(lock, String.valueOf(deadLine));
            if(!key){
                String preValue = jimClient.get(lock);
                if(preValue!=null){
                    long preDeadLine = Long.parseLong(preValue);
                    //如果当前时间大于上次的设置的失效时间,则上次的没有释放,或者上次的机器宕机,所有机器重新获取锁,getset的作用突显出来
                    if (preDeadLine < System.currentTimeMillis()){
                        String oldKey = jimClient.getSet(lock, String.valueOf(deadLine));
                        if(oldKey!=null && Long.parseLong(oldKey) == preDeadLine) {
                            key = true;
                        }else{
                            jimClient.set(lock,oldKey);
                        }
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return key;
    }

    public void release(String lock,long deadLine){
        try {
            if(StringUtils.isNotBlank(jimClient.get(lock)) && Long.parseLong(jimClient.get(lock)) == deadLine){
                jimClient.del(lock);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
经验分享 程序员 微信小程序 职场和发展