PHP实现操作redis的封装类完整实例
本文实例讲述了PHP实现操作redis的封装类。分享给大家供大家参考,具体如下:
<?php /** *Redis操作,支持Master/Slave的负载集群 * *@authorjackluo */ classRedisCluster{ //是否使用M/S的读写集群方案 private$_isUseCluster=false; //Slave句柄标记 private$_sn=0; //服务器连接句柄 private$_linkHandle=array( 'master'=>null,//只支持一台Master 'slave'=>array(),//可以有多台Slave ); /** *构造函数 * *@paramboolean$isUseCluster是否采用M/S方案 */ publicfunction__construct($isUseCluster=false){ $this->_isUseCluster=$isUseCluster; } /** *连接服务器,注意:这里使用长连接,提高效率,但不会自动关闭 * *@paramarray$configRedis服务器配置 *@paramboolean$isMaster当前添加的服务器是否为Master服务器 *@returnboolean */ publicfunctionconnect($config=array('host'=>'127.0.0.1','port'=>6379),$isMaster=true){ //defaultport if(!isset($config['port'])){ $config['port']=6379; } //设置Master连接 if($isMaster){ $this->_linkHandle['master']=newRedis(); $ret=$this->_linkHandle['master']->pconnect($config['host'],$config['port']); }else{ //多个Slave连接 $this->_linkHandle['slave'][$this->_sn]=newRedis(); $ret=$this->_linkHandle['slave'][$this->_sn]->pconnect($config['host'],$config['port']); ++$this->_sn; } return$ret; } /** *关闭连接 * *@paramint$flag关闭选择0:关闭Master1:关闭Slave2:关闭所有 *@returnboolean */ publicfunctionclose($flag=2){ switch($flag){ //关闭Master case0: $this->getRedis()->close(); break; //关闭Slave case1: for($i=0;$i<$this->_sn;++$i){ $this->_linkHandle['slave'][$i]->close(); } break; //关闭所有 case1: $this->getRedis()->close(); for($i=0;$i<$this->_sn;++$i){ $this->_linkHandle['slave'][$i]->close(); } break; } returntrue; } /** *得到Redis原始对象可以有更多的操作 * *@paramboolean$isMaster返回服务器的类型true:返回Masterfalse:返回Slave *@paramboolean$slaveOne返回的Slave选择true:负载均衡随机返回一个Slave选择false:返回所有的Slave选择 *@returnredisobject */ publicfunctiongetRedis($isMaster=true,$slaveOne=true){ //只返回Master if($isMaster){ return$this->_linkHandle['master']; }else{ return$slaveOne?$this->_getSlaveRedis():$this->_linkHandle['slave']; } } /** *写缓存 * *@paramstring$key组存KEY *@paramstring$value缓存值 *@paramint$expire过期时间,0:表示无过期时间 */ publicfunctionset($key,$value,$expire=0){ //永不超时 if($expire==0){ $ret=$this->getRedis()->set($key,$value); }else{ $ret=$this->getRedis()->setex($key,$expire,$value); } return$ret; } /** *读缓存 * *@paramstring$key缓存KEY,支持一次取多个$key=array('key1','key2') *@returnstring||boolean失败返回false,成功返回字符串 */ publicfunctionget($key){ //是否一次取多个值 $func=is_array($key)?'mGet':'get'; //没有使用M/S if(!$this->_isUseCluster){ return$this->getRedis()->{$func}($key); } //使用了M/S return$this->_getSlaveRedis()->{$func}($key); } /* //magicfunction publicfunction__call($name,$arguments){ returncall_user_func($name,$arguments); } */ /** *条件形式设置缓存,如果key不存时就设置,存在时设置失败 * *@paramstring$key缓存KEY *@paramstring$value缓存值 *@returnboolean */ publicfunctionsetnx($key,$value){ return$this->getRedis()->setnx($key,$value); } /** *删除缓存 * *@paramstring||array$key缓存KEY,支持单个健:"key1"或多个健:array('key1','key2') *@returnint删除的健的数量 */ publicfunctionremove($key){ //$key=>"key1"||array('key1','key2') return$this->getRedis()->delete($key); } /** *值加加操作,类似++$i,如果key不存在时自动设置为0后进行加加操作 * *@paramstring$key缓存KEY *@paramint$default操作时的默认值 *@returnint操作后的值 */ publicfunctionincr($key,$default=1){ if($default==1){ return$this->getRedis()->incr($key); }else{ return$this->getRedis()->incrBy($key,$default); } } /** *值减减操作,类似--$i,如果key不存在时自动设置为0后进行减减操作 * *@paramstring$key缓存KEY *@paramint$default操作时的默认值 *@returnint操作后的值 */ publicfunctiondecr($key,$default=1){ if($default==1){ return$this->getRedis()->decr($key); }else{ return$this->getRedis()->decrBy($key,$default); } } /** *添空当前数据库 * *@returnboolean */ publicfunctionclear(){ return$this->getRedis()->flushDB(); } /*===================以下私有方法===================*/ /** *随机HASH得到RedisSlave服务器句柄 * *@returnredisobject */ privatefunction_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之间的值 * *@paramstring$id *@paramint$m *@returnint */ privatefunction_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 */ publicfunctionlpush($key,$value){ return$this->getRedis()->lpush($key,$value); } /** *addlpop */ publicfunctionlpop($key){ return$this->getRedis()->lpop($key); } /** *lrange */ publicfunctionlrange($key,$start,$end){ return$this->getRedis()->lrange($key,$start,$end); } /** *sethashopeation */ publicfunctionhset($name,$key,$value){ if(is_array($value)){ return$this->getRedis()->hset($name,$key,serialize($value)); } return$this->getRedis()->hset($name,$key,$value); } /** *gethashopeation */ publicfunctionhget($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); } /** *deletehashopeation */ publicfunctionhdel($name,$key=null){ if($key){ return$this->getRedis()->hdel($name,$key); } return$this->getRedis()->hdel($name); } /** *Transactionstart */ publicfunctionmulti(){ return$this->getRedis()->multi(); } /** *Transactionsend */ publicfunctionexec(){ return$this->getRedis()->exec(); } }//EndClass //=================TESTDEMO================= //只有一台Redis的应用 $redis=newRedisCluster(); $redis->connect(array('host'=>'127.0.0.1','port'=>6379)); //* $cron_id=10001; $CRON_KEY='CRON_LIST';// $PHONE_KEY='PHONE_LIST:'.$cron_id;// //croninfo $cron=$redis->hget($CRON_KEY,$cron_id); if(empty($cron)){ $cron=array('id'=>10,'name'=>'jackluo');//mysqldata $redis->hset($CRON_KEY,$cron_id,$cron);//setredis } //phonelist $phone_list=$redis->lrange($PHONE_KEY,0,-1); print_r($phone_list); if(empty($phone_list)){ $phone_list=explode(',','13228191831,18608041585');//mysqldata //joinlist if($phone_list){ $redis->multi(); foreach($phone_listas$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'));
希望本文所述对大家PHP程序设计有所帮助。