redis服务器加权轮循算法设计

<?php

/**
 * redis服务器加权轮循算法设计
 * 这段代码的作用是运行在后台来维护连接数的负载均衡与一个可连接的服务器列表
 */


class Balancer{
   
    //定义三台server
    private static $server = array(
            array(
                    'host'=>'127.0.0.1',
                    'port'=>6379,
                    'status'=>'run',//运行状态:run表示允许,stop表示停止
                    'weight'=>3,//权重
            ),
            array(
                    'host'=>'127.0.0.2',
                    'port'=>6379,
                    'status'=>'run',
                    'weight'=>2,
            ),
            array(
                    'host'=>'127.0.0.3',
                    'port'=>6379,
                    'status'=>'run',
                    'weight'=>1,
            ),
    );
   
    //需要生成的服务器轮询列表
    private static $list = array();
   
    //保存redis服务器列表的list
    const redis_list = 'redis_list';
   
    /**
     * 生成加权轮训的服务器列表
     */

    public static function RoundRobin(){
        foreach(self::$server as $k => $v){
            if($v['status'] == 'run'){
                //服务器状态自动检测
                $redis = new redis();
                $ret = @$redis->connect($v['host'], $v['port'], 3);
                if($ret){
                    for($i=0;$i<$v['weight'];$i++){
                        array_push(self::$list,$v);
                    }
                }
            }
        }
       
        return self::$list;
    }
   
    /**
     * 保存到redis,然后在你需要连接redis的时候就可以每次从队列获取一个ip来进行连接
     */

    public static function save2redis(){
        //连接本地redis
        $redis = new redis();
        $redis->connect('127.0.0.1', 6379);
       
        $llen = $redis->lLen(self::redis_list);
        $result = $redis->lrange(self::redis_list, 0 , $llen-1);
       
        //检查是否有更新
        $list = array();
        foreach(self::$list as $k => $v){
            $list[$k] = json_encode($v);
        }
        //print_r($list);
        //print_r($result);
        $tmp1 = array_diff($result, $list);//检查待更新的数组比原数组少的配置项
        $tmp2 = array_diff($list, $result);//检查待更新的数组比原数组多的配置项
       
        if(!$tmp1 && !$tmp2) return true;//无更新返回
       
        $redis->multi();
        $redis->del(self::redis_list);
       
        //服务器列表入队
        foreach(self::$list as $k => $v){
            $redis->lpush(self::redis_list, json_encode($v));
        }
        $redis->exec();
    }
}

Balancer::RoundRobin();//生成服务器列表
Balancer::save2redis();//存入redis

//end
查看本地redis:
127.0.0.1:6379> lrange redis_list 0 100
1) "{\"host\":\"127.0.0.3\",\"port\":6379,\"status\":\"run\",\"weight\":1}"
2) "{\"host\":\"127.0.0.2\",\"port\":6379,\"status\":\"run\",\"weight\":2}"
3) "{\"host\":\"127.0.0.2\",\"port\":6379,\"status\":\"run\",\"weight\":2}"
4) "{\"host\":\"127.0.0.1\",\"port\":6379,\"status\":\"run\",\"weight\":3}"
5) "{\"host\":\"127.0.0.1\",\"port\":6379,\"status\":\"run\",\"weight\":3}"
6) "{\"host\":\"127.0.0.1\",\"port\":6379,\"status\":\"run\",\"weight\":3}"
这就是我们生成的队列,在获取的时候采用以下方式,即可获取到需要连接的一台redis的服务器信息,队列中的数据会按顺序一直循环
127.0.0.1:6379> rpoplpush redis_list redis_list
1) "{\"host\":\"127.0.0.3\",\"port\":6379,\"status\":\"run\",\"weight\":1}"

转载请注明:小Y » redis服务器加权轮循算法设计

赞 (0) 评论 (0) 分享 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址