| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- <?php
- /**
- * This is a Redis exntend class
- */
- class RedisClient
- {
- public static $instance = NULL;
- public static $linkHandle = array();
- //construct:connect redis
- public function __construct($configs)
- {
- $this->initRedis($configs);
- }
- /**
- * 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
- */
- private function initRedis($conf){
- foreach ($conf['master'] as $k=>$v){
- $obj = new Redis();
- if($obj->pconnect($v['host'],$v['port'])){
- $obj->auth($v['auth']);
- self::$linkHandle['master'][] = $obj;
-
- }
- }
-
- foreach ($conf['slave'] as $k=>$v){
- $obj = new Redis();
- if($obj->pconnect($v['host'],$v['port'])){
- $obj->auth($v['auth']);
- self::$linkHandle['slave'][] = $obj;
- }
- }
- }
-
- /**
- * 获得redis Resources
- *
- * @param $key redis存的key/或随机值
- * @param string $tag master/slave
- */
- public function getRedis($key=null,$tag='master'){
- empty($key)?$key = uniqid():'';
- $arr_index = $this->getHostByHash($key,count(self::$linkHandle[$tag])); //获得相应主机的数组下标
- return self::$linkHandle[$tag][$arr_index];
- }
-
- /**
- * 随机取出主机
- * @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;
- }
-
- //-------------------------------------------------------------------------------
-
- 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不存在,返回特殊值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);
- }
- /**
- * 向已存在于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($key)->del($key);
- }
- }
- /**
- * 添加一个字符串值到LIST容器的顶部(左侧),如果KEY不存在,曾创建一个LIST容器,如果KEY存在并且不是一个LIST容器,那么返回FLASE。
- *
- * @param unknown $key
- * @param unknown $val
- */
- public function lPush($key,$val){
- $this->getRedis($key)->lPush($key,$val);
- }
-
- /**
- * 返回LIST顶部(左侧)的VALUE,并且从LIST中把该VALUE弹出。
- * @param unknown $key
- */
- public function lPop($key){
- $this->getRedis($key)->lPop($key);
- }
- /**
- * 批量的添加多个key 到redis
- * @param $fieldArr
- */
- public function mSetnx($fieldArr){
- $this->getRedis()->mSetnx($fieldArr);
- }
- }
- ?>
|