美文网首页
使用redis简单实现选举功能

使用redis简单实现选举功能

作者: 和平菌 | 来源:发表于2019-12-19 14:19 被阅读0次

需求:实现选举功能,分布式部署应用,其中一个应用充当Leader分发任务,其他应用处理任务,当Leader机器宕机时,再选举新的Leader。
直接上代码:

//每个应用初始化时,自己生成一个唯一的uuid.
String clientId = UUID.randomUUID().toString().replace("-", "");

//定时检查是否是Leader
@Scheduled(fixedRate = 1000 * 60 * 1)
    public void toDo(){
        if(!checkLeader()){//如果不是leader 就不分发任务
            return;
        }

        分发任务....
    }



private boolean checkLeader(){
        String v = cache.set(Constans.LEADER_KEY, clientId, "NX", "EX", timeOut);
        boolean setnx = "OK".equals(v);
        if(setnx){
            log.info("set leader with client:" + Constans.CLIENT_ID);//如果设置成功了,那么本台机器就是Leader
            return true;
        } else {
            String value = cache.get(Constans.LEADER_KEY);
            if(Constans.CLIENT_ID.equals(value)){//如果设置不成功,那么检查Leader是否是本台机器
                log.info("continue leader with client:" + Constans.CLIENT_ID);
                cache.expire(Constans.LEADER_KEY, timeOut);//给Leader续命
                return true;
            }
        }
        return false;
    }


@PreDestroy
    public void onDestory(){
        cache.del(Constans.LEADER_KEY); //应用停止时候移除Leader
        log.info("remove leader with client:" + Constans.CLIENT_ID); 
    }

相关文章

网友评论

      本文标题:使用redis简单实现选举功能

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