Laravel框架实现redis集群的方法分析


Posted in PHP onSeptember 14, 2017

本文实例讲述了Laravel框架实现redis集群的方法。分享给大家供大家参考,具体如下:

在app/config/database.php中配置如下:

'redis' => array(
    'cluster' => true,
    'default' => array(
      'host'   => '172.21.107.247',
      'port'   => 6379,
    ),
   'redis1' => array(
      'host'   => '172.21.107.248',
      'port'   => 6379,
    ),

其中cluster选择为true,接下来就可以作集群使用了;

如果把session的driver设置为redis,则可以使用其集群功能了:

我们来看下session的实现,当我们在代码中这样写:

Session::put('test', 124);

实际的执行流程是这样的:

Illuminate\Support\Facades\Session
Illuminate\Support\Facades\Facade
Illuminate\Session\Facade::app['session']->put
Illuminate\Session\Facade::app['session']为Illuminate\Session\SessionManager
Illuminate\Support\Manager::__call

Session会根据返回创建driver

$this->app['config']['session.driver']

即配置文件中配置的,这里我们配置为redis

Illuminate\Session\SessionManager::Illuminate\Session\SessionManager

最终由Illuminate\Session\Store来负责put的调用

而Store类负责存储的类是Illuminate\Session\CacheBasedSessionHandler

后者又将请求转发给$this->app['cache']->driver($driver)
……
经过一系列代码追查,存储类为Predis\Client\Database,看其构造函数:

public function __construct(array $servers = array())
{
    if (isset($servers['cluster']) && $servers['cluster'])
    {
      $this->clients = $this->createAggregateClient($servers);
    }
    else
    {
      $this->clients = $this->createSingleClients($servers);
    }
}

如果设置为集群,则调用createAggregateClient方法

protected function createAggregateClient(array $servers)
{
    $servers = array_except($servers, array('cluster'));
    return array('default' => new Client(array_values($servers)));
}

这里会把所有服务器放在default组中

实际存数据的类是Predis\Client,这里有根据配置创建服务器的代码,具体可以自己看下;

Predis\Cluster\PredisClusterHashStrategy类负责计算key的hash,关键函数:

getHash

getKeyFromFirstArgument

而Predis\Cluster\Distribution\HashRing负责服务器环的维护,关键函数

addNodeToRing

get

hash

大概原理是这样,如执行以下redis命令

get ok

会将ok作crc32运算得到一个hash值

所有服务器按一定算法放到一个长度默认为128的数组中,每个服务器在其中占几项,由以下决定:

权重/总权重*总的服务器数量*128,可参考Predis\Cluster\Distribution\HashRing::addNodeToRing方法

每一项的hash值是按服务器ip:端口的格式,作crc32计算的

protected function addNodeToRing(&$ring, $node, $totalNodes, $replicas, $weightRatio)
{
    $nodeObject = $node['object'];
    $nodeHash = $this->getNodeHash($nodeObject);
    $replicas = (int) round($weightRatio * $totalNodes * $replicas);
    for ($i = 0; $i < $replicas; $i++) {
      $key = crc32("$nodeHash:$i");
      $ring[$key] = $nodeObject;
    }
}

key的hash值也有了,服务器环也计算好了,剩下的就是查找了,二分法能较快的查找相应的服务器节点

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
一个取得文件扩展名的函数
Oct 09 PHP
PHP数据流应用的一个简单实例
Sep 14 PHP
PHP中HTML标签过滤技巧
Jan 07 PHP
PHP IE中下载附件问题解决方法
Jan 07 PHP
Dwz与thinkphp整合下的数据导出到Excel实例
Dec 04 PHP
php获取QQ头像并显示的方法
Dec 23 PHP
php中解析带中文字符的url函数分享
Jan 20 PHP
PHP小偷程序的设计与实现方法详解
Oct 15 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
Feb 15 PHP
php JWT在web端中的使用方法教程
Sep 06 PHP
PHP中quotemeta()函数的用法讲解
Apr 04 PHP
ThinkPHP开发--使用七牛云储存
Sep 14 #PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
Sep 13 #PHP
PHP memcache在微信公众平台的应用方法示例
Sep 13 #PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
Sep 13 #PHP
PHP 实现公历日期与农历日期的互转换
Sep 13 #PHP
php生成条形码的图片的实例详解
Sep 13 #PHP
php之可变函数的实例详解
Sep 13 #PHP
You might like
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
PHP弱类型的安全问题详细总结
2016/09/25 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
javascript 日期常用的方法
2009/11/11 Javascript
jquery下利用jsonp跨域访问实现方法
2010/07/29 Javascript
javascript创建createXmlHttpRequest对象示例代码
2014/02/10 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
2014/03/27 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
Jquery动态替换div内容及动态展示的方法
2015/01/23 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
JavaScript中的toDateString()方法使用详解
2015/06/12 Javascript
AngularJS入门教程之迭代器过滤详解
2016/08/18 Javascript
微信小程序 wx.uploadFile无法上传解决办法
2016/12/14 Javascript
JS实现的RGB网页颜色在线取色器完整实例
2016/12/21 Javascript
详解打造 Vue.js 可复用组件
2017/03/24 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
2017/08/14 jQuery
微信小程序实现留言板
2018/10/31 Javascript
vue模仿网易云音乐的单页面应用
2019/04/24 Javascript
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
jQuery+ajax实现用户登录验证
2020/09/13 jQuery
Python实现简单HTML表格解析的方法
2015/06/15 Python
Python用zip函数同时遍历多个迭代器示例详解
2016/11/14 Python
Python Lambda函数使用总结详解
2019/12/11 Python
win10从零安装配置pytorch全过程图文详解
2020/05/08 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
String是最基本的数据类型吗?
2013/06/13 面试题
国际金融专业大学生职业生涯规划书
2013/12/28 职场文书
益达广告词
2014/03/14 职场文书
领导党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书