>백엔드 개발 >PHP 튜토리얼 >Redis 작업 클래스(마스터-슬레이브 지원)

Redis 작업 클래스(마스터-슬레이브 지원)

WBOY
WBOY원래의
2016-07-29 09:05:181136검색

기본 구성 파일:

<?php
$CONFIG_REDIS_DEFAULT = array(
	'master' => array('127.0.0.1',6379),
	'slaver'  => array('127.0.0.1',6379)
);

?>

작업 클래스:

<?php

class FSRedis {
	
	const RD_MASTER = 'master';
	const RD_SLAVER = 'slaver';
	
	//默认key
	private static $mKey = '';

	//实例对象
	private static $mInstance = array();

	//服务器配置
	private $_serverConfig = array(); 

	private $_redisMaster;
	private $_redisSlaver;
	
	
	public static function Instance($defaultConfig = array()) {
		self::$mKey = md5(serialize($defaultConfig));
		if (isset( self::$mInstance[self::$mKey])) {
			return self::$mInstance[self::$mKey];
		}
		return self::$mInstance[self::$mKey] = new FSRedis($defaultConfig);
	}
	
	public function __construct($defaultConfig = array()) {
		$this->_serverConfig = $defaultConfig;
	}	

	private function createRedisInstance($config = array()) {
		if (count($config) < 2) {
			throw new Exception(strtr('Config invalid', array()));
		}
		$redis = new Redis();
		$redis->connect($config[0], $config[1]);
		return $redis;
	}	
	
	public function getRedisMaster() {
		if ($this->_redisMaster === null) {
			$this->_redisMaster = $this->createRedisInstance($this->_serverConfig[self::RD_MASTER]) ;			
		}
		return $this->_redisMaster;
	}

	public function getRedisSlave() {
		if ($this->_redisSlaver === null) {
			$this->_redisSlaver = $this->createRedisInstance($this->_serverConfig[self::RD_SLAVER]) ;			
		}
		return $this->_redisSlaver;
	}
	
	public function get($key, $master = false) {
		if(empty($key)) {
			return false;
		}
		$func = is_array($key) ? 'mGet' : 'get';
		if($master) {
			$redis = $this->getRedisMaster();
		}else{
			$redis = $this->getRedisSlave();
		}
		if(!$redis) {
			return false;
		}
		$value = $redis->$func($key);
		if($value === false) {			
			return false;
		}
		return $value;
	}

	public function set($key, $value, $expire = 0) {
		if(empty($key)) {			
			return false;
		}
		$redis = $this->getRedisMaster();		
		if(!$redis) {
			return false;
		}
		if($expire) {
			$ret = $redis->setex($key, $expire, $value);
		}
		else {
			$ret = $redis->set($key, $value);
		}
		if($ret === false) {
			return false;
		}
		return $ret;
	}

    
    /**
     * 条件形式设置缓存,如果 key 不存时就设置,存在时设置失败
     *
     * @param string $key 缓存KEY
     * @param string $value 缓存值
     * @return boolean
     */
	public function setnx($key, $value){
        return $this->getRedisMaster()->setnx($key, $value);
    }
       
    /**
     * 删除缓存
     *
     * @param string || array $key 缓存KEY,支持单个健:"key1" 或多个健:array('key1','key2')
     * @return int 删除的健的数量
     */
	 public function remove($key){
		return $this->getRedisMaster()->delete($key);
    }
       
    public function __call($name,$value) {
		/**
		 * 读写分离
		 */
		$redisWrite = array('zAdd','zRem','hIncrBy','info','rename', 'rpush', 'lpop','hMset', 'sadd', 'srem', 'incr', 'spop');
		$redisRead = array('zCard','zRank','zrevRank','zRevRange','hLen','hKeys','hVals','zRange','hMget','hGetAll', 'lrange', 'llen','mGet', 'smembers', 'sismember', 'scard', 'keys');
		if(in_array($name,$redisWrite)) { //master
			$redis = $this->getRedisMaster();
			return call_user_func_array(array($redis,$name),$value);
		}
		elseif(in_array($name,$redisRead)) { //slave		
			$redis = $this->_getRedisSlave();
			return call_user_func_array(array($redis,$name),$value);
		}
	}
}

?>

위 내용은 내용적인 측면을 포함하여 redis 작업 클래스(마스터-슬레이브 지원)를 소개한 내용이 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.