php redis 分布式类

配置:

$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() {
	}
}

  

时间: 2024-08-09 19:52:48

php redis 分布式类的相关文章

Redis分布式锁的实现以及工具类

一.应用场景: 本文应用的场景为在查询数据时,发现数据不存在此时就需要去查询数据库并且更新缓存,此时可能存在高并发的请求同时打在数据库上,而针对这种情况必须要给这些请求加锁,故而采用了分布式锁的方式.(当然分布式锁的应用场景较多,我只是针对本人工作的业务场景做了对应的处理) 二.Redis锁的工具类: /** * Redis分布式锁 */ @Component public class RedisLock { @Autowired private RedisTemplate redisTempl

j2ee分布式架构 dubbo + springmvc + mybatis + ehcache + redis 分布式架构

介绍 <modules>        <!-- jeesz 工具jar -->        <module>jeesz-utils</module>        <!-- jeesz 公共配置jar -->        <module>jeesz-config</module>        <!-- jeesz 核心框架jar -->        <module>jeesz-framew

{精华}分布式、微服务、云架构dubbo+zookeeper+springmvc+mybatis+shiro+redis分布式大型互联网企业架构

摘要: Jeesz主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件.数据权限组件.数据字典组件.核心工具 组件.视图操作组件.工作流组件.代码生成等.采用分层设计.双重验证.提交数据安全编码.密码加密.访问验证.数据权限验证. 平台简介 Jeesz是一个分布式的框架,提供项目模块化.服务化.热插拔的思想,高度封装安全性的Java EE快速开发平台. Jeesz本身集成Dubbo服务管控.Zookeeper注册中心.Redis分布式缓存技术.Fast

精华分布式、微服务、云架构dubbo+zookeeper+springmvc+mybatis+shiro+redis分布式大型互联网企业架构

平台简介 Jeesz是一个分布式的框架,提供项目模块化.服务化.热插拔的思想,高度封装安全性的Java EE快速开发平台. Jeesz本身集成Dubbo服务管控.Zookeeper注册中心.Redis分布式缓存技术.FastDFS分布式文件系统.ActiveMQ异步消息中间件.Nginx负载均衡等分布式技术 使用Maven做项目管理,项目模块化,提高项目的易开发性.扩展性 以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apach

J2EE分布式架构 dubbo+springmvc+mybatis+ehcache+redis分布式架构

平台简介 Jeesz是一个分布式的框架,提供项目模块化.服务化.热插拔的思想,高度封装安全性的Java EE快速开发平台. Jeesz本身集成Dubbo服务管控.Zookeeper注册中心.Redis分布式缓存技术.FastDFS分布式文件系统.ActiveMQ异步消息中间件.Nginx负载均衡等分布式技术 使用Maven做项目管理,项目模块化,提高项目的易开发性.扩展性 以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apach

一致性Hash算法在Redis分布式中的使用

由于redis是单点,但是项目中不可避免的会使用多台Redis缓存服务器,那么怎么把缓存的Key均匀的映射到多台Redis服务器上,且随着缓存服务器的增加或减少时做到最小化的减少缓存Key的命中率呢?这样就需要我们自己实现分布式. Memcached对大家应该不陌生,通过把Key映射到Memcached Server上,实现快速读取.我们可以动态对其节点增加,并未影响之前已经映射到内存的Key与memcached Server之间的关系,这就是因为使用了一致性哈希.因为Memcached的哈希策

{精华}分布式微服务云架构dubbo+zookeeper+springmvc+mybatis+shiro+redis分布式大型互联网企业架构

摘要: Jeesz主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件.数据权限组件.数据字典组件.核心工具 组件.视图操作组件.工作流组件.代码生成等.采用分层设计.双重验证.提交数据安全编码.密码加密.访问验证.数据权限验证. 平台简介 Jeesz是一个分布式的框架,提供项目模块化.服务化.热插拔的思想,高度封装安全性的Java EE快速开发平台. Jeesz本身集成Dubbo服务管控.Zookeeper注册中心.Redis分布式缓存技术.Fast

redis分布式锁小试

一.场景 项目A监听mq中的其他项目的部署消息(包括push_seq, status, environment,timestamp等),然后将部署消息同步到数据库中(项目X在对应环境[environment]上部署的push_seq[项目X的版本]).那么问题来了,mq中加入包含了两个部署消息 dm1 和 dm2,dm2的push_seq > dm1的push_seq,在分布式的情况下,dm1 和 dm2可能会分别被消费(也就是并行),那么在同步数据库的时候可能会发生 dm1 的数据保存 后于

精华分布式微服务云架构dubbo+zookeeper+springmvc+mybatis+shiro+redis分布式大型互联网企业架构

平台简介 Jeesz是一个分布式的框架,提供项目模块化.服务化.热插拔的思想,高度封装安全性的Java EE快速开发平台. Jeesz本身集成Dubbo服务管控.Zookeeper注册中心.Redis分布式缓存技术.FastDFS分布式文件系统.ActiveMQ异步消息中间件.Nginx负载均衡等分布式技术 使用Maven做项目管理,项目模块化,提高项目的易开发性.扩展性 以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apach