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數組