码迷,mamicode.com
首页 > Web开发 > 详细

php redis 分布式类

时间:2015-06-17 21:28:52      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:

 

配置:

$redis_config = array(
	‘prefix‘	=> ‘ylmall_‘,
	‘master‘	=> array(
		‘host‘	=> "192.168.1.19",
		‘port‘	=> "6379",
	)
);

类文件:


class cls_redis {
	/**
	 *
	 * @var $_configMaster master config,default to empty array
	 */
	private $_configMaster = array ();
	
	/**
	 *
	 * @var $_configSlave slave config,default to empty array
	 */
	private $_configSlave = array ();
	
	/**
	 *
	 * @var $_redisKeyPrefix the redis key prefix
	 */
	private $_redisKeyPrefix = ‘‘;
	private $debug = false;
	public $queries = array ();
	
	/**
	 *
	 * @ignore
	 *
	 */
	function __construct($redis_config) {
		$this->_configMaster = $redis_config [‘master‘];
		// $this->_configSlave = $redis_config[‘slave‘];
		$this->_redisKeyPrefix = $redis_config [‘prefix‘];
	}
	
	/**
	 * Get redis key prefix
	 *
	 * @return string
	 */
	public function getKeyPrefix() {
		return $this->_redisKeyPrefix;
	}
	
	/**
	 * Set redis key prefix
	 *
	 * @return
	 *
	 */
	public function setKeyPrefix($prefix) {
		$this->_redisKeyPrefix = $prefix;
	}
	
	/**
	 *
	 * @var $_redisMaster redis master,default to null
	 */
	private $_redisMaster = null;
	
	/**
	 * Get redis master server.If fail,throw ErrorException.
	 *
	 * @return Redis
	 */
	public function getRedisMaster() {
		if ($this->_redisMaster instanceof Redis) {
			return $this->_redisMaster;
		} else {
			$this->_redisMaster = new Redis ();
			try {
				$this->_redisMaster->connect ( $this->_configMaster [‘host‘], $this->_configMaster [‘port‘] );
				$this->_redisMaster->setOption ( Redis::OPT_PREFIX, $this->_redisKeyPrefix );
			} catch ( Exception $e ) {
				// $this->errorShow ();
				throw new ErrorException ( "Connect redis server " . implode ( ",", $this->_configMaster ) . " fail !" );
			}
			return $this->_redisMaster;
		}
	}
	/**
	 *
	 * @var $_redisSlave redis slave,default to null
	 */
	private $_redisSlave = null;
	
	/**
	 * Get redis salve server.If fail,throw a ErrorException.
	 *
	 * @return Redis
	 */
	public function getRedisSlave() {
		if ($this->_redisSlave instanceof Redis) {
			return $this->_redisSlave;
		} else {
			$this->_redisSlave = new Redis ();
			try {
				// $this->_redisSlave->connect($this->_configSlave[‘host‘], $this->_configSlave[‘port‘]);
				// $this->_redisSlave->setOption(Redis::OPT_PREFIX, $this->_redisKeyPrefix);
				$this->_redisSlave->connect ( $this->_configMaster [‘host‘], $this->_configMaster [‘port‘] );
				$this->_redisSlave->setOption ( Redis::OPT_PREFIX, $this->_redisKeyPrefix );
			} catch ( Exception $e ) {
				// $this->errorShow();
				// throw new ErrorException("Connect redis server " . implode(",", $this->_configSlave) . " fail !");
				$this->errorShow ();
				throw new ErrorException ( "Connect redis server " . implode ( ",", $this->_configMaster ) . " fail !" );
			}
			
			return $this->_redisSlave;
		}
	}
	
	/**
	 *
	 * @var $_cmdScopeMaster master sever command scope
	 */
	private static $_cmdScopeMaster = array (
			‘multi‘,
			‘exec‘,
			‘discard‘,
			‘watch‘,
			‘unwatch‘,
			// key - value structure
			‘setex‘,
			‘psetex‘,
			‘setnx‘,
			‘del‘,
			‘delete‘,
			‘incr‘,
			‘incrBy‘,
			‘incrByFloat‘,
			‘decr‘,
			‘decrBy‘,
			// list structrue
			‘lPush‘,
			‘rPush‘,
			‘lPushx‘,
			‘rPushx‘,
			‘lSet‘,
			‘lRem‘,
			‘lRemove‘,
			‘lInsert‘,
			‘lTrim‘,
			‘listTrim‘,
			// set structrue
			‘sAdd‘,
			‘sRem‘,
			‘sRemove‘,
			‘sMove‘,
			‘sPop‘,
			// hash structrue
			‘hSet‘,
			‘hSetNx‘,
			‘hDel‘,
			‘hIncrBy‘,
			‘hIncrByFloat‘,
			‘hMset‘,
			// transaction
			‘multi‘,
			‘exec‘,
			// sorted set structrue
			‘zAdd‘,
			‘zDelete‘,
			‘zDeleteRangeByRank‘,
			‘zCount‘,
			‘zRange‘,
			‘zRangeByScore‘,
			‘expire‘,
			// server
			‘info‘ 
	);
	
	/**
	 * set master server commadn scope
	 *
	 * @param array $cmds        	
	 * @return void
	 */
	public function setCmdScopeMaster(array $cmds) {
		self::$_cmdScopeMaster = array_unique ( array_merge ( self::$_cmdScopeMaster, $cmds ) );
	}
	
	/**
	 *
	 * @var $_cmdScopeSlave slave sever command scope
	 */
	private static $_cmdScopeSlave = array (
			// key - value structure
			‘exists‘,
			‘mGet‘,
			‘getMultiple‘,
			// list structure
			‘lPop‘,
			‘rPop‘,
			‘blPop‘,
			‘brPop‘,
			‘lSize‘,
			‘lIndex‘,
			‘lGet‘,
			‘lRange‘,
			‘lGetRange‘,
			// set structrue
			‘sIsMember‘,
			‘sContains‘,
			‘sCard‘,
			‘sSize‘,
			‘sRandMember‘,
			‘sMembers‘,
			// hash structrue
			‘hGetAll‘,
			‘hGet‘,
			‘hLen‘,
			‘hKeys‘,
			‘hVals‘,
			‘hExists‘,
			‘hMGet‘,
			// sorted set structrue
			‘zRevRange‘,
			‘zRevRangeByScore‘ 
	);
	
	/**
	 * set slave server commadn scope
	 *
	 * @param array $cmds        	
	 * @return void
	 */
	public function setCmdScopeSlave(array $cmds) {
		self::$_cmdScopeSlave = array_unique ( array_merge ( self::$_cmdScopeSlave, $cmds ) );
	}
	
	/**
	 * set a key value
	 *
	 * @param string $key        	
	 * @param mixed $value        	
	 * @param int $expire        	
	 * @return bool
	 */
	public function set($key, $value, $expire = 0) {
		if ($this->debug) {
			$this->queries [] = "custom set : $key $value";
		}
		$value = serialize ( $value );
		$this->getRedisMaster ();
		if ($expire) {
			return $this->_redisMaster->setex ( $key, $expire, $value );
		} else {
			return $this->_redisMaster->set ( $key, $value );
		}
	}
	
	/**
	 * Get the value of a key
	 *
	 * @param string $key        	
	 * @return mixed
	 */
	public function get($key) {
		if ($this->debug) {
			$this->queries [] = "custom get : $key";
		}
		$this->getRedisSlave ();
		return unserialize ( $this->_redisSlave->get ( $key ) );
	}
	
	/**
	 * Call Redis method use master or slave instance.If fail,throw a ErrorException.
	 *
	 * @return
	 *
	 */
	public function __call($name, $args) {
		if ($this->debug) {
			$this->queries [] = "call method : $name " . implode ( ‘,‘, $args );
		}
		
		if (in_array ( $name, self::$_cmdScopeMaster )) {
			$this->getRedisMaster ();
			return call_user_func_array ( array (
					$this->_redisMaster,
					$name 
			), $args );
		} elseif (in_array ( $name, self::$_cmdScopeSlave )) {
			$this->getRedisSlave ();
			return call_user_func_array ( array (
					$this->_redisSlave,
					$name 
			), $args );
		} else {
			throw new ErrorException ( "It is an invalidate method : {$name}!" );
		}
	}
	
	/**
	 * Set redis resource to null when serializing
	 */
	public function __sleep() {
		$this->_redisMaster = $this->_redisSlave = null;
	}
	
	/**
	 * Set redis resource to null when destruct
	 */
	public function __destruct() {
		$this->_redisMaster = $this->_redisSlave = null;
	}
	public function errorShow() {
	}
}

  

php redis 分布式类

标签:

原文地址:http://www.cnblogs.com/icyy/p/4584345.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!