php操作redies封裝的類

n5em 9年前發布 | 2K 次閱讀 PHP redies

<?php
/**

  • Redis 操作,支持 Master/Slave 的負載集群
  • @author jackluo */
    class RedisCluster{

    // 是否使用 M/S 的讀寫集群方案
    private $_isUseCluster = false;

    // Slave 句柄標記
    private $_sn = 0;

    // 服務器連接句柄
    private $_linkHandle = array(

     'master'=>null,// 只支持一臺 Master  
     'slave'=>array(),// 可以有多臺 Slave  
    

    );

    /**

    • 構造函數
    • @param boolean $isUseCluster 是否采用 M/S 方案 */
      public function __construct($isUseCluster=false){
      $this->_isUseCluster = $isUseCluster;
      }

      /**

    • 連接服務器,注意:這里使用長連接,提高效率,但不會自動關閉
    • @param array $config Redis服務器配置
    • @param boolean $isMaster 當前添加的服務器是否為 Master 服務器
    • @return boolean */
      public function connect($config=array('host'=>'127.0.0.1','port'=>6379), $isMaster=true){
      // default port
      if(!isset($config['port'])){

       $config['port'] = 6379;  
      

      }
      // 設置 Master 連接
      if($isMaster){

       $this->_linkHandle['master'] = new Redis();  
       $ret = $this->_linkHandle['master']->pconnect($config['host'],$config['port']);  
      

      }else{

       // 多個 Slave 連接  
       $this->_linkHandle['slave'][$this->_sn] = new Redis();  
       $ret = $this->_linkHandle['slave'][$this->_sn]->pconnect($config['host'],$config['port']);  
       ++$this->_sn;  
      

      }
      return $ret;
      }

      /**

    • 關閉連接
    • @param int $flag 關閉選擇 0:關閉 Master 1:關閉 Slave 2:關閉所有
    • @return boolean */
      public function close($flag=2){
      switch($flag){

       // 關閉 Master  
       case 0:  
           $this->getRedis()->close();  
       break;  
       // 關閉 Slave  
       case 1:  
           for($i=0; $i<$this->_sn; ++$i){  
               $this->_linkHandle['slave'][$i]->close();  
           }  
       break;  
       // 關閉所有  
       case 1:  
           $this->getRedis()->close();  
           for($i=0; $i<$this->_sn; ++$i){  
               $this->_linkHandle['slave'][$i]->close();  
           }  
       break;  
      

      }
      return true;
      }

      /**

    • 得到 Redis 原始對象可以有更多的操作
    • @param boolean $isMaster 返回服務器的類型 true:返回Master false:返回Slave
    • @param boolean $slaveOne 返回的Slave選擇 true:負載均衡隨機返回一個Slave選擇 false:返回所有的Slave選擇
    • @return redis object */
      public function getRedis($isMaster=true,$slaveOne=true){
      // 只返回 Master
      if($isMaster){

       return $this->_linkHandle['master'];  
      

      }else{

       return $slaveOne ? $this->_getSlaveRedis() : $this->_linkHandle['slave'];  
      

      }
      }

      /**

    • 寫緩存
    • @param string $key 組存KEY
    • @param string $value 緩存值
    • @param int $expire 過期時間, 0:表示無過期時間 */
      public function set($key, $value, $expire=0){
      // 永不超時
      if($expire == 0){

       $ret = $this->getRedis()->set($key, $value);  
      

      }else{

       $ret = $this->getRedis()->setex($key, $expire, $value);  
      

      }
      return $ret;
      }

      /**

    • 讀緩存
    • @param string $key 緩存KEY,支持一次取多個 $key = array('key1','key2')
    • @return string || boolean 失敗返回 false, 成功返回字符串 */
      public function get($key){
      // 是否一次取多個值
      $func = is_array($key) ? 'mGet' : 'get';
      // 沒有使用M/S
      if(! $this->_isUseCluster){
       return $this->getRedis()->{$func}($key);  
      
      }
      // 使用了 M/S
      return $this->_getSlaveRedis()->{$func}($key);
      }

/ // magic function public function __call($name,$arguments){ return call_user_func($name,$arguments);
}
/
/**

 * 條件形式設置緩存,如果 key 不存時就設置,存在時設置失敗 
 * 
 * @param string $key 緩存KEY 
 * @param string $value 緩存值 
 * @return boolean 
 */  
public function setnx($key, $value){  
    return $this->getRedis()->setnx($key, $value);  
}  

/** 
 * 刪除緩存 
 * 
 * @param string || array $key 緩存KEY,支持單個健:"key1" 或多個健:array('key1','key2') 
 * @return int 刪除的健的數量 
 */  
public function remove($key){  
    // $key => "key1" || array('key1','key2')  
    return $this->getRedis()->delete($key);  
}  

/** 
 * 值加加操作,類似 ++$i ,如果 key 不存在時自動設置為 0 后進行加加操作 
 * 
 * @param string $key 緩存KEY 
 * @param int $default 操作時的默認值 
 * @return int 操作后的值 
 */  
public function incr($key,$default=1){  
    if($default == 1){  
        return $this->getRedis()->incr($key);  
    }else{  
        return $this->getRedis()->incrBy($key, $default);  
    }  
}  

/** 
 * 值減減操作,類似 --$i ,如果 key 不存在時自動設置為 0 后進行減減操作 
 * 
 * @param string $key 緩存KEY 
 * @param int $default 操作時的默認值 
 * @return int 操作后的值 
 */  
public function decr($key,$default=1){  
    if($default == 1){  
        return $this->getRedis()->decr($key);  
    }else{  
        return $this->getRedis()->decrBy($key, $default);  
    }  
}  

/** 
 * 添空當前數據庫 
 * 
 * @return boolean 
 */  
public function clear(){  
    return $this->getRedis()->flushDB();  
}  

/* =================== 以下私有方法 =================== */  

/** 
 * 隨機 HASH 得到 Redis Slave 服務器句柄 
 * 
 * @return redis object 
 */  
private function _getSlaveRedis(){  
    // 就一臺 Slave 機直接返回  
    if($this->_sn <= 1){  
        return $this->_linkHandle['slave'][0];  
    }  
    // 隨機 Hash 得到 Slave 的句柄  
    $hash = $this->_hashId(mt_rand(), $this->_sn);  
    return $this->_linkHandle['slave'][$hash];  
}  

/** 
 * 根據ID得到 hash 后 0~m-1 之間的值 
 * 
 * @param string $id 
 * @param int $m 
 * @return int 
 */  
private function _hashId($id,$m=10)  
{  
    //把字符串K轉換為 0~m-1 之間的一個值作為對應記錄的散列地址  
    $k = md5($id);  
    $l = strlen($k);  
    $b = bin2hex($k);  
    $h = 0;  
    for($i=0;$i<$l;$i++)  
    {  
        //相加模式HASH  
        $h += substr($b,$i*2,2);  
    }  
    $hash = ($h*1)%$m;  
    return $hash;  
}  

/** 
 *    lpush 
 */  
public function lpush($key,$value){  
    return $this->getRedis()->lpush($key,$value);  
}  

/** 
 *    add lpop 
 */  
public function lpop($key){  
    return $this->getRedis()->lpop($key);  
}  
/** 
 * lrange 
 */  
public function lrange($key,$start,$end){  
    return $this->getRedis()->lrange($key,$start,$end);      
}  

/** 
 *    set hash opeation 
 */  
public function hset($name,$key,$value){  
    if(is_array($value)){  
        return $this->getRedis()->hset($name,$key,serialize($value));      
    }  
    return $this->getRedis()->hset($name,$key,$value);  
}  
/** 
 *    get hash opeation 
 */  
public function hget($name,$key = null,$serialize=true){  
    if($key){  
        $row = $this->getRedis()->hget($name,$key);  
        if($row && $serialize){  
            unserialize($row);  
        }  
        return $row;  
    }  
    return $this->getRedis()->hgetAll($name);  
}  

/** 
 *    delete hash opeation 
 */  
public function hdel($name,$key = null){  
    if($key){  
        return $this->getRedis()->hdel($name,$key);  
    }  
    return $this->getRedis()->hdel($name);  
}  
/** 
 * Transaction start 
 */  
public function multi(){  
    return $this->getRedis()->multi();      
}  
/** 
 * Transaction send 
 */  

public function exec(){  
    return $this->getRedis()->exec();      
}  



}// End Class

// ================= TEST DEMO =================

// 只有一臺 Redis 的應用
$redis = new RedisCluster();
$redis->connect(array('host'=>'127.0.0.1','port'=>6379));

//*
$cron_id = 10001;
$CRON_KEY = 'CRON_LIST'; //
$PHONE_KEY = 'PHONE_LIST:'.$cron_id;//

//cron info
$cron = $redis->hget($CRON_KEY,$cron_id);
if(empty($cron)){

$cron = array('id'=>10,'name'=>'jackluo');//mysql data  
$redis->hset($CRON_KEY,$cron_id,$cron); // set redis      

}
//phone list
$phone_list = $redis->lrange($PHONE_KEY,0,-1);
print_r($phone_list);
if(empty($phone_list)){
$phone_list =explode(',','13228191831,18608041585'); //mysql data
//join list
if($phone_list){
$redis->multi();
foreach ($phone_list as $phone) {
$redis->lpush($PHONE_KEY,$phone);
}
$redis->exec();
}
}

print_r($phone_list);

/*$list = $redis->hget($cron_list,);

var_dump($list);/
//
/

//$redis->set('id',35);

/*
$redis->lpush('test','1111');
$redis->lpush('test','2222');
$redis->lpush('test','3333');

$list = $redis->lrange('test',0,-1);  
print_r($list);  
$lpop = $redis->lpop('test');  
print_r($lpop);  
$lpop = $redis->lpop('test');  
print_r($lpop);  
$lpop = $redis->lpop('test');  
print_r($lpop);  

*/
// var_dump($redis->get('id'));</pre>

 本文由用戶 n5em 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!