php的redis 操做類,適用於單臺或多臺、多組redis服務器操做

redis 操做類,包括單臺或多臺、多組redis服務器操做,適用於業務複雜、高性能要求的 php web 應用。php

redis.php:web

<?php
 /*
   redis 操做類,適用於單臺或多臺、多組redis服務器操做

   使用方法:
   一、$rs=new mz_redis();$rs->load_config_file('redis_config1.php');$www=$rs->connect(1,true,0)==單臺讀鏈接,鏈接read_array第一個元素對應的redis服務器中的隨機一臺;$rs->get($www[0],'abc'),獲取$www鏈接對象裏的'abc'key的值。
   二、$rs=new mz_redis();$rs->load_config_file('redis_config2.php');$www=$rs->connect(1,true,1)==單臺讀鏈接,鏈接read_array第二個元素對應的redis服務器中的隨機一臺
   三、$rs=new mz_redis();$rs->load_config_file('redis_config3.php');$www=$rs->connect(1,false,0)==多臺讀鏈接,鏈接read_array每個元素對應的redis服務器中的隨機一臺;數組形式的鏈接對象$www,須要循環去操做,與第一種方式有所區別
   四、$rs=new mz_redis();$rs->load_config_file('redis_config4.php');$www=$rs->connect(2,false,0)==多臺寫鏈接,鏈接write_array每個元素對應的redis服務器
   五、$rs=new mz_redis();$rs->load_config_file('redis_config5.php');$www=$rs->connect(2,true,0)==單臺寫鏈接,鏈接write_array第一個元素對應的redis服務器
   注意:$www是數組,redis有不少操做方法,本類並未徹底包括,簡單的均可以本身擴展,這個類主要「單臺或多臺、多組redis服務器鏈接操做」
   有問題聯繫 QQ 8704953 。
 */

class pub_redis{

    private $read_link=array();   // 一維數組讀資源
    private $write_link=array();  // 一維數組寫資源

    private $read_array=array();  // 二維數組
    private $write_array=array(); // 二維數組

    /*
     * 構造函數
    */
    public function __construct(){

        if (!extension_loaded('redis')) {
            exit('服務器不支持redis擴展');
        }

    }

    /*
     * 初始化 redis 讀寫配置數組,都是二維數組
     * 不能業務類型的redis應用,配置到不一樣的文件中
     * 切換不一樣業務類型redis的鏈接,只須要執行本方法導入不一樣的redis配置文件,而後connect()
    */
    public function load_config_file($redis_config_file='redis_config1.php'){

        require_once($redis_config_file);
        $this->read_array=$read_array;
        $this->write_array=$write_array;
        $read_array=$write_array=null;

    }

    /*
     * 鏈接函數,redis連接入口
     * $single==true,單臺操做 ; false就是多臺操做
     * type==1:read ; type==2:write
     * $index,單臺操做,指定操做某一臺,數組的索引
     * 返回redis連接資源,一維數組形式,下標爲從0開始的數字
    */
    public function connect($type=1,$single=true,$index=0){ 

        if($type==1){
            if($single){
                $idx=array_rand($this->read_array[$index]);
                $data=array(array($this->read_array[$index][$idx]));
            }
            else{
                $data=array();
                foreach($this->read_array as $key=>$val){
                    $idx=array_rand($val);
                    $data[]=array($this->read_array[$key][$idx]);
                }
            }
            $this->mz_connect($data,$this->read_link,$single,$index);
            $rs=$this->read_link;
        }
        else if($type==2){
            $this->mz_connect($this->write_array,$this->write_link,$single,$index);
            $rs=$this->write_link;
        }
        else{
            exit('參數錯誤');
        }

        sort($rs);
        return $rs;

    }

    /*
     * 鏈接資源數組化
    */
    public function mz_connect($array,&$link,$single,$index){ 
        if($single){
            if(!isset($link[$array[$index]['ip']]) || $link[$array[$index]['ip']]===false){
                $link[$array[$index]['ip']]=$this->do_connect($array[$index]['ip'],$array[$index]['pwd'],$array[$index]['port'],$array[$index]['time_out'],$array[$index]['db']);
            }
        }
        else{
            $num=count($array);
            for($i=0;$i<$num;++$i){
                $index=array_rand($array);
                if(!isset($link[$array[$index]['ip']]) || $link[$array[$index]['ip']]===false){
                    $link[$array[$index]['ip']]=$this->do_connect($array[$index]['ip'],$array[$index]['pwd'],$array[$index]['port'],$array[$index]['time_out'],$array[$index]['db']);
                }
                unset($array[$index]);
            }
        }
    }

    /*
     * 鏈接函數,執行鏈接
     * 鏈接redis與選擇數據庫,並確認是否能夠正常鏈接,鏈接不上就返回false
    */
    public function do_connect($ip,$pwd='',$port=6379,$time_out=0.3,$db=1){

        $redis = new Redis();
        try {
            $redis->connect($ip,$port,$time_out); 
            if($pwd!=''){
                $redis->auth($pwd);
            }
            $redis->select($db);

        } catch (Exception $e) {
            $redis=false;
        }
        return $redis;
    }

    /*
     * 判斷key是否存在
     * $obj redis鏈接對象
    */
    public function key_exists($obj,$key){
        return $obj->exists($key);
    }

    /*
     * 判斷key剩餘有效時間,單位秒
     * $obj redis鏈接對象
    */
    public function get_ttl($obj,$key){
        return $obj->ttl($key);
    }

    /*
     * 獲取字符串對象
     * $obj redis鏈接對象
    */
    public function get($obj,$key){
        return json_decode($obj->get($key));
    }

    /*
     * 設置字符串,帶生存時間
     * $obj redis鏈接對象
    */
    public function set($obj,$key,$time,$value){
        $str=json_encode($value);
        return $obj->setex($key,$time,$str);
    }

    /*
     * 設置鎖
     * $obj redis鏈接對象
     * $str, 字符串
    */
    public function set_lock($obj,$key,$value){
        return $obj->setnx($key,$value);
    }

    /*
     * 刪除key
     * $obj redis鏈接對象
    */
    public function delete_key($obj,$key){
        return $obj->delete($key);
    }

    /*
     * 鏈表增長多個元素
     * $obj redis鏈接對象
    */
    public function list_add_element($obj,$key,$array,$direction='left'){
        if(!is_array($array)){
            $array=array($array);
        }
        foreach($array as $val){
            ($direction == 'left') ? $obj->lPush($key, json_encode($val)) : $obj->rPush($key, json_encode($val));
        }
    }

    /*
     * 鏈表彈出多個元素
     * $obj redis鏈接對象
     * 返回數組
    */
    public function list_pop_element($obj,$key,$num=1,$direction='right') {
        for($i=0;$i<$num;$i++){
           $value = ($direction == 'right') ? $obj->rPop($key) : $obj->lPop($key);
           $data[]=json_decode($value);
        }
        return $data;
    }

    /*
     * 哈希表新增或修改元素
     * $obj redis鏈接對象
     * $array 關聯數組
    */
    public function hash_set($obj,$key,$array){
        if(!$is_array($array)){
            exit('設置哈希表參數異常');
        }
        $obj->hmset($key,$array);
    }

    /*
     * 哈希表讀取元素
     * $obj redis鏈接對象
     * $array 關聯數組
    */
    public function hash_get($obj,$key,$array){
        if(!$is_array($array)){
            return $obj->hget($key,$array);
        }
        return $obj->hmget($key,$array);
    }

}

?>

 

redis_config1.php:
redis

<?php
/*
 * 讀寫redis配置
 * 讀寫數組下標相同,爲主從關係
 */
$write_array=array(
    0=>array('ip'=>'172.16.10.23','port'=>6379,'time_out'=>0.3,'pwd'=>'123456','db'=>1),
    1=>array('ip'=>'172.16.10.23','port'=>6379,'time_out'=>0.3,'pwd'=>'123456','db'=>1)
);

$read_array=array(
    0=>array(
        array('ip'=>'172.16.10.23','port'=>6379,'time_out'=>0.3,'pwd'=>'654321','db'=>1),
        array('ip'=>'172.16.10.23','port'=>6379,'time_out'=>0.3,'pwd'=>'123456','db'=>1)
    ),
    1=>array(
        array('ip'=>'172.16.10.23','port'=>6379,'time_out'=>0.3,'pwd'=>'5678765','db'=>1),
        array('ip'=>'172.16.10.23','port'=>6379,'time_out'=>0.3,'pwd'=>'345678','db'=>1)
    )
);

?>

 

redis_config2.php數據庫

<?php
/*
 * 讀寫redis配置
 * 讀寫數組下標相同,爲主從關係
 */
$write_array=array(
    0=>array('ip'=>'172.16.10.23','port'=>6379,'time_out'=>0.3,'pwd'=>'123456','db'=>1),
    1=>array('ip'=>'172.16.10.23','port'=>6379,'time_out'=>0.3,'pwd'=>'123456','db'=>1)
);

$read_array=array(
    0=>array(
        array('ip'=>'172.16.10.23','port'=>6379,'time_out'=>0.3,'pwd'=>'654321','db'=>1),
        array('ip'=>'172.16.10.23','port'=>6379,'time_out'=>0.3,'pwd'=>'123456','db'=>1)
    ),
    1=>array(
        array('ip'=>'172.16.10.23','port'=>6379,'time_out'=>0.3,'pwd'=>'5678765','db'=>1),
        array('ip'=>'172.16.10.23','port'=>6379,'time_out'=>0.3,'pwd'=>'345678','db'=>1)
    )
);

?>

 

連接:json

http://outofmemory.cn/code-snippet/2728/php-redis-operation-class-shiyong-yu-dantai-huo-duotai-duozu-redis-fuwuqi-operation數組

相關文章
相關標籤/搜索