PHP redis負載均衡代碼!(暫且這麼叫吧)

<!-- lang: php -->
<?php
/**
 * This is a Redis exntend class
* jay.w
 */

class RedisClient
{
public static $instance = NULL;
public static $linkHandle = array();
private $conf;
//construct:connect redis
public function __construct($config)
{
	$this->conf = $config;
}

/**
 * Get a instance of MyRedisClient
 *
 * @param string $key
 * @return object
 */
static function getInstance($configs)
{
	if (!self::$instance) {
		self::$instance = new self($configs);
	}
	return self::$instance;
}


/**
 * 得到redis Resources
 * 
 * @param $key	 redis存的key/或隨機值
 * @param string $tag	master/slave
 */
public function getRedis($key=null,$tag='master'){
	if(!empty(self::$linkHandle[$tag])){
		return self::$linkHandle[$tag];
	}
	
	empty($key)?$key = uniqid():'';
	$redis_arr  = $this->conf[$tag];
	$arr_index = $this->getHostByHash($key,count($this->conf[$tag])); //得到相應主機的數組下標
	
	$obj = new Redis();
	$obj->pconnect($redis_arr[$arr_index]['host'],$redis_arr[$arr_index]['port']);
	self::$linkHandle[$tag] = $obj;
	
	return $obj;
}

/**
 * 隨機取出主機
 * @param $key		$變量key值
 * @param $n		主機數
 * @return string
 */
private function getHostByHash($key,$n){
	if($n<2) return 0;
	$u = strtolower($key);
	$id = sprintf("%u", crc32($key));
	
	$m = base_convert( intval(fmod($id, $n)), 10, $n);
	return $m{0};
}

/**
 * 關閉鏈接
 * pconnect 鏈接是沒法關閉的
 *  
 * @param int $flag 關閉選擇 0:關閉 Master 1:關閉 Slave 2:關閉全部
 * @return boolean
 */
public function close($flag=2){
	switch($flag){
		// 關閉 Master
		case 0:
			foreach (self::$linkHandle['master'] as $var){
				$var->close();
			}
			break;
			// 關閉 Slave
		case 1:
			foreach (self::$linkHandle['slave'] as $var){
				$var->close();
			}
			break;
			// 關閉全部
		case 1:
			$this->close(0);
			$this->close(1);
			break;
	}
	return true;
}

//-------------------------------------------------------------------------------

/**
 * 返回 key 指定的哈希集中全部的字段和值
 * @param $key
 * @return 返回值
 * 多個返回值:哈希集中字段和值的列表。當 key 指定的哈希集不存在時返回空列表。
 */
public function hGetAll($key){
	return $this->getRedis($key,'slave')->hGetAll($key);
}

/**
 * redis 字符串(String) 類型
 * 將key和value對應。若是key已經存在了,它會被覆蓋,而無論它是什麼類型。
 * @param $key
 * @param $value
 * @param $exp 過時時間
 */
public function set($key,$value,$exp=0){
	$redis = $this->getRedis($key);
	$redis->set($key,$value);
	!empty($exp) && $redis->expire($key,$exp);
}

/**
 * 設置key對應字符串value,而且設置key在給定的seconds時間以後超時過時
 * @param  $key
 * @param  $value
 * @param  $exp
 */
public function setex($key,$value,$exp=0){
	$redis = $this->getRedis($key);
	$redis->setex($key,$value,$exp);
}
/**
 * 設置一個key的過時時間
 * 
 * @param  $key		
 * @param  $exp	過時時間
 */
public function setExpire($key,$exp){
	$redis = $this->getRedis($key);
	$redis->expire($key,$exp);
}
/**
 * 返回key的value。若是key不存在,返回特殊值nil。若是key的value不是string,就返回錯誤,由於GET只處理string類型的values。
 * @param $key
 */
public function get($key){
	return $this->getRedis($key,'slave')->get($key);
}
/**
 * KEYS pattern
 * 查找全部匹配給定的模式的鍵
 * @param $is_key   默認是一個非正則表達試,使用模糊查詢
 * @param $key
 */
public function keys($key,$is_key=true){
	if ($is_key) {
		return $this->getRedis($key,'slave')->keys("*$key*");
	}
	return $this->getRedis($key,'slave')->keys("$key");
}

/**
 * 批量填充HASH表。不是字符串類型的VALUE,自動轉換成字符串類型。使用標準的值。NULL值將被儲存爲一個空的字符串。
 * 
 * 能夠批量添加更新 value,key 不存在將建立,存在則更新值
 * 
 * @param  $key
 * @param  $fieldArr
 * @return
 * 若是命令執行成功,返回OK。
 * 當key不是哈希表(hash)類型時,返回一個錯誤。
 */
public function hMSet($key,$fieldArr){
	return $this->getRedis($key)->hmset($key,$fieldArr);
}
/**
 * 設置 key 指定的哈希集中指定字段的值。若是 key 指定的哈希集不存在,會建立一個新的哈希集並與 key 關聯。若是字段在哈希集中存在,它將被重寫。
 *
 * @param $key
 * @param $field_name
 * @param $field_value
 * @return 1若是field是一個新的字段,0若是field原來在map裏面已經存在
 */
public function hSet($key,$field_name,$field_value){
	return $this->getRedis($key)->hset($key,$field_name,$field_value);
}
/**
 * 向已存在於redis裏的Hash 添加多個新的字段及值
 * 
 * @param  $key			redis 已存在的key
 * @param  $field_arr	kv形數組
 */
public function hAddFieldArr($key,$field_arr){
	foreach ($field_arr as $k=>$v){
		$this->hAddFieldOne($key, $k, $v);
	}
}

/**
 * 向已存在於redis裏的Hash 添加一個新的字段及值
 * @param  $key
 * @param  $field_name
 * @param  $field_value
 * @return bool
 */
public function hAddFieldOne($key,$field_name,$field_value){
	return $this->getRedis($key)->hsetnx($key,$field_name,$field_value);
}

/**
 * 向Hash裏添加多個新的字段或修改一個已存在字段的值
 * @param $key
 * @param $field_arr
 */
public function hAddOrUpValueArr($key,$field_arr){
	foreach ($field_arr as $k=>$v){
		$this->hAddOrUpValueOne($key, $k, $v);
	}
}
/**
 * 向Hash裏添加多個新的字段或修改一個已存在字段的值
 * @param  $key
 * @param  $field_name
 * @param  $field_value
 * @return boolean 
 * 1 if value didn't exist and was added successfully, 
 * 0 if the value was already present and was replaced, FALSE if there was an error.
 */
public function hAddOrUpValueOne($key,$field_name,$field_value){
	return $this->getRedis($key)->hset($key,$field_name,$field_value);
}

/**
 *  刪除哈希表key中的多個指定域,不存在的域將被忽略。
 * @param $key
 * @param $field_arr
 */
public function hDel($key,$field_arr){
	foreach ($field_arr as $var){
		$this->hDelOne($key,$var);
	}
}

/**
 * 刪除哈希表key中的一個指定域,不存在的域將被忽略。
 * 
 * @param $key
 * @param $field
 * @return BOOL TRUE in case of success, FALSE in case of failure
 */
public function hDelOne($key,$field){
	return $this->getRedis($key)->hdel($key,$field);
}

/**
 * 重命名key
 * 
 * @param $oldkey
 * @param $newkey
 */
public function renameKey($oldkey,$newkey){
	return $this->getRedis($oldkey)->rename($oldkey,$newkey);
}

/**
 * 刪除一個或多個key
 * @param $keys
 */
public function delKey($keys){
	if(is_array($keys)){
		foreach ($keys as $key){
			$this->getRedis($key)->del($key);
		}
	}else {
		$this->getRedis($keys)->del($keys);
	}
}
/**
 * 添加一個字符串值到LIST容器的頂部(左側),若是KEY不存在,曾建立一個LIST容器,若是KEY存在而且不是一個LIST容器,那麼返回FLASE。
 * 
 * @param $key
 * @param $val
 */
public function lPush($key,$val){
	$this->getRedis($key)->lPush($key,$val);
}

/**
 * 返回LIST頂部(左側)的VALUE,而且從LIST中把該VALUE彈出。
 * @param $key
 */
public function lPop($key){
	$this->getRedis($key)->lPop($key);
}


/**
 * 批量的添加多個key 到redis
 * @param $fieldArr
 */
public function mSetnx($fieldArr){

	$this->getRedis()->mSetnx($fieldArr);
}

} ?>php

相關文章
相關標籤/搜索