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 相关文章推荐
支持oicq头像的留言簿(一)
Oct 09 PHP
增加反向链接的101个方法 站长推荐
Jan 31 PHP
海河写的 Discuz论坛帖子调用js的php代码
Aug 23 PHP
php利用header函数实现文件下载时直接提示保存
Nov 12 PHP
PHP自动识别字符集并完成转码详解
Aug 02 PHP
PHP使用SOAP调用.net的WebService数据
Nov 12 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
Apr 09 PHP
php实现的九九乘法口诀表简洁版
Jul 28 PHP
Zend Framework教程之模型Model基本规则和使用方法
Mar 04 PHP
PHP迭代与递归实现无限级分类
Aug 28 PHP
php web环境和命令行环境下查找php.ini的位置
Jul 17 PHP
Yii 框架使用数据库(databases)的方法示例
May 19 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 fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
php获取apk包信息的方法
2014/08/15 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
2011/11/15 Javascript
js函数中onmousedown和onclick的区别和联系探讨
2013/05/19 Javascript
使用js解决由border属性引起的div宽度问题
2013/11/26 Javascript
基于JavaScript实现轮播图代码
2016/07/14 Javascript
轻松掌握JavaScript代理模式
2016/08/26 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
2016/12/08 Javascript
jQuery实现别踩白块儿网页版小游戏
2017/01/18 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
prototype.js简单实现ajax功能示例
2017/10/18 Javascript
Vue.set()实现数据动态响应的方法
2018/02/07 Javascript
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
vue多页面项目中路由使用history模式的方法
2019/09/23 Javascript
如何通过vscode运行调试javascript代码
2020/07/24 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
Python利用matplotlib生成图片背景及图例透明的效果
2017/04/27 Python
Python基于sklearn库的分类算法简单应用示例
2018/07/09 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
html5/css3响应式页面开发总结
2018/10/16 HTML / CSS
大专计算机个人求职的自我评价
2013/10/21 职场文书
财务管理专业求职信
2014/06/11 职场文书
文秘班元旦晚会活动策划方案
2014/08/28 职场文书
优秀教师先进事迹材料
2014/12/15 职场文书
招标保密承诺书
2015/01/20 职场文书
锅炉工岗位职责
2015/02/13 职场文书
实习护士自荐信
2015/03/25 职场文书
python正则表达式re.search()的基本使用教程
2021/05/21 Python
如何用PHP websocket实现网页实时聊天
2021/05/26 PHP
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers