<!-- 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