`
vtrtbb
  • 浏览: 362795 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

redis操作类(支持主从)

    博客分类:
  • php
阅读更多

基本配置文件:

<?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);
		}
	}
        
        public function close() {
                $this->_redisMaster = null;
		$this->_redisSlaver = null;
        }	
}

?>

 

分享到:
评论

相关推荐

    redis安装配置 及主从同步

    除了基本的安装配置,Redis还支持许多高级特性,如Sentinel哨兵系统用于高可用性、Cluster集群实现数据分区,以及lua脚本支持自定义业务逻辑等。在实际应用中,了解并掌握这些特性可以更好地利用Redis提升系统性能和...

    redis常用命令,redis配置文件,redis持久化,redis事务,redis主从复制,jedis的使用

    Redis 提供了很多有用的命令来管理和操作数据。下面是一些常用的 Redis 命令: * SET key value:设置键值对 * GET key:获取键对应的值 * EXISTS key:检查键是否存在 * DEL key:删除键 * EXPIRE key seconds:...

    redis-2.8.13安装配置主从服务器Master-Slave

    手动操作通常涉及修改从服务器配置并重启服务,自动故障转移则依赖于 Sentinel 系统(Redis 2.8.13 版本未包含 Sentinel,但后续版本已支持)。 6. **Java 客户端**:压缩包中的 `RedisHandler.java` 文件可能是 ...

    ServiceStack.Redis操作工具类

    在使用ServiceStack.Redis操作工具类时,你需要了解以下关键知识点: 1. **连接管理**:ServiceStack.Redis提供了一个`IRedisClient`接口,它是所有Redis操作的基础。你可以通过`RedisManagerPool`或`RedisClient`...

    (重新整理版)redis的java客户端jedis 管理类代码 支持主从复制的自动选择和自动恢复,读/写分离

    * redis主从架构的jedis客户端管理类,大概1000多行代码左右 * 1 支持主从复制key/value,pop/push,pub/sub,读/写分离等功能的灾难失败自动选择和恢复 * 2 可以选择读写分离功能,主写从读,默认不启用,都使用主服务...

    redis教程及主从配置和集群搭建

    ### Redis 教程及主从配置和集群搭建 #### Redis 基础知识与应用场景 **Redis**(Remote Dictionary Server)是一种开源的键值(Key-Value)存储系统,使用 C 语言编写,以其高性能和丰富的数据结构而闻名。Redis ...

    c++ 操作redis数据库

    在C++中操作Redis,可以充分利用C++的灵活性和Redis的高效性,为应用程序提供强大的数据支持。 首先,`rediscommand.cpp`可能包含了C++与Redis交互的命令实现。在C++中操作Redis,通常会使用一个库来简化与Redis...

    7、spring redis 注解开发 单片机 集群 主从复制1

    9. **RedisTemplate**:这是Spring Data Redis提供的核心模板类,用于执行Redis操作。它可以配置序列化器以决定如何将Java对象转换为Redis能理解的格式,以及从Redis读取数据时如何反序列化。 10. **缓存管理器**:...

    redis的java客户端jedis 管理类代码 支持主从复制的自动选择和自动恢复,读/写分离

    * redis主从架构的jedis客户端管理类,大概1000行代码左右 * 1 支持主从复制key/value,pop/push,pub/sub,读/写分离等功能的灾难失败自动选择和恢复 * 2 可以选择读写分离功能,主写从读,默认不启用,都使用主服务进行...

    springboot整合redis.zip

    - 消息队列:Redis的发布订阅功能可以作为简单的消息队列使用,Spring Data Redis提供了`JedisConnectionFactory`和`RedisMessageListenerContainer`等类支持。 7. **注解驱动的数据访问** - 使用Spring Data ...

    Springboot+redis集成

    综上所述,"SpringBoot+redis集成"不仅涵盖了基础的Redis操作,还包括了不同模式下的高可用性配置,以及在高并发和分布式场景下的应用实践。通过学习和实践这个例子,开发者可以深入理解SpringBoot与Redis的整合,...

    redis集群以及Spring-data-redis操作集群

    在Redis 3.0及以上版本,引入了集群功能,支持主从复制、槽分配以及故障转移等特性。 **集群搭建** Redis集群的搭建通常包括以下几个步骤: 1. **准备节点**:至少需要三个独立的Redis实例作为集群的初始节点。 2...

    redis相关jar包(redis2.1.5、jedis2.9.0)

    同时,Redis支持主从复制、持久化机制(RDB和AOF),确保了数据的安全性。 Jedis是Java社区广泛使用的Redis客户端库,版本2.9.1包含了对Redis各种命令的支持,包括基本的键值操作、事务处理、发布订阅、Lua脚本执行...

    Java+redis缓存工具类(SSM)

    6. **Java Redis工具类**:这个项目提供的工具类,可能包含了连接池配置、Redis操作方法(如获取、设置、删除、过期时间设置等)以及异常处理机制。这样的工具类能够帮助开发者方便地调用Redis命令,简化代码。 7. ...

    Redis Sentinel主从高可用方案1

    Redis Sentinel 是 Redis 为了实现高可用...通过监控、通知和自动故障迁移功能,确保 Redis 集群在主节点故障时仍能保持服务,同时通过 Jedis SentinelPool 支持,使得客户端能轻松适应这种变化,实现平滑的主从切换。

    tp框架封装redis读写分离类.rar

    TP框架内已内置了对Redis的支持,可以利用`\think\cache\driver\Redis`类进行操作。 3. **读写路由**:在执行操作时,类需要判断是读操作还是写操作,并选择正确的连接。对于读操作,类会从配置的从库列表中随机...

    03_redis 主从复制 Redis集群和哨兵模式.docx

    - **数据库分类**:在主从模式中,数据库分为两类——主数据库(Master)和从数据库(Slave)。 - **工作流程**: - **主数据库**负责所有写入操作,并在数据发生变化时将这些变化同步到**从数据库**。 - **从...

    jedis.zip——java开发redis的工具类

    这个类通常会提供各种Redis操作的抽象方法,如字符串操作、哈希表操作、列表操作、集合操作以及有序集合操作等。开发者可以根据需求调用这些方法来执行相应的Redis命令,而无需直接与Jedis实例交互,从而降低了代码...

    Redis 题库 笔记 PDF文件电子版 494道题 2023年 精选 面试 自学 考试

    一级分类:基础知识- Redis 数据类型- Redis 命令- Redis 过期策略- Redis 事务- Redis 持久化- Redis 发布订阅- Redis Lua 脚本- Redis 位图操作- Redis 分布式锁- Redis 主从复制- Redis 集群- Redis Sentinel- ...

    Redis主从实现读写分离.doc

    在 Redis 中,主从复制是一个异步过程,主节点会持续地将写操作的日志(也称为命令传播日志或RDB文件)发送给从节点。从节点接收到这些日志后,再应用到自身的数据集,确保与主节点保持一致。这种模式对于高可用性和...

Global site tag (gtag.js) - Google Analytics