天天看點

PHP中使用redis哨兵

  1. 封裝一個redis操作,代碼如下:
class Redis {

    use Singleton;

    public static $redis = "";

    //私有化構造函數
    private function __construct()
    {
//        if (!extension_loaded('redis')) {
//            throw new \Exception("redis.so檔案不存在");
//        }

        try {
            //擷取redis配置
            $redisConfig = Config::get("redis");
            //var_dump($redisConfig);
            self::$redis = new \Redis();
            $result = self::$redis->connect($redisConfig['host'], $redisConfig['port'], $redisConfig['time_out']);
        } catch (\Exception $e) {
            throw new \Exception("redis服務異常");
        }

        if ($result === false) {
            throw new \Exception("redis連接配接失敗");
        }
    }

    /**
     * 魔術方法靜态調用
     * @param $method_name // 調用的redis方法名
     * @param $param // 調用redis方法時傳遞的參數
     * @return mixed
     */
//    public function __call($method_name, $param)
//    {
//        if (!self::$redis) {
//            self::getInstance();
//        }
//        try {
//            return call_user_func_array([self::$redis, $method_name], $param);
//        } catch (\Exception $e) {
//            print $e->getMessage();
//            exit;
//        }
//    }

    //私有化克隆方法
    public function __clone()
    {
        // TODO: Implement __clone() method.
    }

    /**
     * 魔術方法調用redis中的方法
     * @param $method_name
     * @param $arguments
     * @return mixed
     */
    public function __call($method_name, $arguments)
    {
        return self::$redis->$method_name(...$arguments);
    }

}
           
  1. 通過哨兵動态擷取redis的主從配置
use app\lib\redis\Redis as MyRedis;
class Index
{
    public function index()
    {

        $redis = MyRedis::getInstance();
        //擷取redis master的狀态資訊
        $masterInfo = $redis->rawCommand('SENTINEL', 'masters');
        $master = $redis->rawCommand("SENTINEL", 'master', 'mymaster');

        //擷取redis slaves的資訊
        $slaves = $redis->rawCommand("SENTINEL", 'slaves', 'mymaster');
        dump($slaves);
    }
}
           
  1. 擷取之後即可建立redis執行個體進行使用

繼續閱讀