<?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<) return ;
$u = strtolower($key);
$id = sprintf("%u", crc32($key)); $m = base_convert( intval(fmod($id, $n)), , $n);
return $m{};
} /**
* 关闭连接
* pconnect 连接是无法关闭的
*
* @param int $flag 关闭选择 0:关闭 Master 1:关闭 Slave 2:关闭所有
* @return boolean
*/
public function close($flag=){
switch($flag){
// 关闭 Master
case :
foreach (self::$linkHandle['master'] as $var){
$var->close();
}
break;
// 关闭 Slave
case :
foreach (self::$linkHandle['slave'] as $var){
$var->close();
}
break;
// 关闭所有
case :
$this->close();
$this->close();
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=){
$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=){
$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 redis负载均衡代码的更多相关文章

  1. net core 实战之 redis 负载均衡和"高可用"实现

    net core 实战之 redis 负载均衡和"高可用"实现 1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的& ...

  2. nginx+tomcat+redis负载均衡及session共享

    概述 本文档是用来详细描述 nginx+tomcat+redis负载均衡实现session共享 所需软件及下载地址 软件名称 下载地址 功能说明 Nginx-v1.6.0 http://nginx.o ...

  3. php封装redis负载均衡类

    $array = array( 'master' => array( "redis://127.0.0.1:6379?timeout=1", ), 'slave' => ...

  4. asp.net core 实战之 redis 负载均衡和"高可用"实现

    1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...

  5. nginx之 nginx + tomcat + redis 负载均衡且session一致性

    说明: 本文描述的是 nginx + tomcat + redis 实现应用负载均衡且满足session一致性,从安装到配置的全部过程,供大家学习!nginx 代理服务器ip: 10.219.24.2 ...

  6. redis 负载均衡 集群配置

    redis 官网 http://redis.io/ 中文网站 http://redis.cn/ 谷歌代码的redis项目 https://code.google.com/p/redis/ http:/ ...

  7. Hbase负载均衡流程以及源码

    hmater负责把region均匀到各个region server .hmaster中有一个线程任务是专门处理负责均衡的,默认每隔5分钟执行一次. 每次负载均衡操作可以分为两步: 生成负载均衡计划表 ...

  8. 负载均衡session共享问题

    负载均衡+session共享(memcached-session-manager实现) http://www.cnblogs.com/youzhibing/p/5094460.html http:// ...

  9. 【译】gRPC负载均衡

    原文地址:https://github.com/grpc/grpc/blob/master/doc/load-balancing.md gRPC负载均衡 范围 本文档解释了gPRC的负载均衡的设计. ...

随机推荐

  1. ofbiz进击 第一节。 新建自己的webapp项目

    创建一个webapp的过程更新下来项目(直接从svn上面切下来就好),要先ant clean 下,然后在重新ant下.一: start sheel here :ant create-component ...

  2. 侧菜单栏的实现SlidingPaneLayout

    SlidingPaneLayout分为两部分,上面的 左划出部分和没划出的时候 <?xml version="1.0" encoding="utf-8"? ...

  3. PHP与jquery前后台交互的小程序

    1 <!DOCTYPE HTML> <html> <head> <meta charset = "utf-8"> <scrip ...

  4. react绑定事件

    1.显示隐藏 2.输入框输入内容,立即显示出来 代码如下: 注意:版本 React v15.0.1 ReactDOM v15.0.1 browser.min.js是编译文件,将代码解析为浏览器识别的j ...

  5. springmvc+spring+mybatis分页查询实例版本1,ver1.0

    无聊做做看看,几乎没有怎么仔细做过这方面的,总是以为很简单,想想就会,实际做起来结合工作经验感觉还是挺有收获的,可以用在自己的项目上 第一版本思路:框架使用ssm,这个无所谓,采用分页语句查询指定页面 ...

  6. 夺命雷公狗---DEDECMS----21dedecms按照地区取出电影内容

    我们现在要做的就是: 这些电影都是要按照地区来取出才可以的,但是我们arclist标签里面有没有按照条件来查找的地方,我们只好换套路了,要不然条条大路都不通,,,, 我们先来构造一条语句: 他这个标签 ...

  7. CSS 文字阴影(text-shadow)怎么用

    textShadow="1px 1px 1px #ff0000" textShadow="水平位移 垂直位移 模糊半径 阴影颜色"

  8. android 项目学习随笔五(JSON解析)

    1.利用Xutils获取网络数据 /** * 从服务器获取数据 需要权限: <uses-permission * android:name="android.permission.IN ...

  9. top.location.href和localtion.href有什么不同

    top.location.href=”url”          在顶层页面打开url(跳出框架) self.location.href=”url”         仅在本页面打开url地址 pare ...

  10. IIS7.5真变态,服务器时间格式导致不生成WebResource.axd

    把时间调成HH:mm格式后,IIS不生成WebResource.axd了,,,从凌晨一点弄到现在......