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 相关文章推荐
IIS下配置Php+Mysql+zend的图文教程
Dec 08 PHP
php中去除所有js,html,css代码
Oct 12 PHP
PHP读取ACCESS数据到MYSQL的代码
May 11 PHP
实用PHP会员权限控制实现原理分析
May 29 PHP
div li的多行多列 无刷新分页示例代码
Oct 16 PHP
php导出csv格式数据并将数字转换成文本的思路以及代码分享
Jun 05 PHP
基于PHP的简单采集数据入库程序
Jul 30 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
Nov 24 PHP
php单例模式示例分享
Feb 12 PHP
PHP信号处理机制的操作代码讲解
Apr 19 PHP
PHP实现批量修改文件名的方法示例
Sep 18 PHP
PHP网页缓存技术优点及代码实例
Jul 29 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类型约束用法示例
2016/09/28 PHP
Javascript 各浏览器的 Javascript 效率对比
2008/01/23 Javascript
javascript document.images实例
2008/05/27 Javascript
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
JQuery 实现的页面滚动时浮动窗口控件
2009/07/10 Javascript
JavaScript中的集合及效率
2010/01/08 Javascript
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
2011/01/12 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
jQuery定义插件的方法
2015/12/18 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
Vuex之理解Store的用法
2017/04/19 Javascript
详解Vue整合axios的实例代码
2017/06/21 Javascript
JS实现的透明度渐变动画效果示例
2018/04/28 Javascript
微信小程序自定义导航栏实例代码
2019/04/05 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
VUE使用 wx-open-launch-app 组件开发微信打开APP功能
2020/08/11 Javascript
JavaScript实现刮刮乐效果
2020/11/01 Javascript
详解Python函数可变参数定义及其参数传递方式
2017/08/02 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
HTML5 canvas基本绘图之绘制五角星
2016/06/27 HTML / CSS
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
澳大利亚领先的亚麻品牌:Bed Threads
2019/12/16 全球购物
网络书店创业计划书
2014/02/07 职场文书
我有一个梦想演讲稿
2014/05/05 职场文书
2014年幼儿园保育工作总结
2014/12/02 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
2015年学生资助工作总结
2015/05/25 职场文书
参观监狱警示教育心得体会
2016/01/15 职场文书
《索溪峪的野》教学反思
2016/02/19 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang
Python 处理表格进行成绩排序的操作代码
2021/07/26 Python
Java无向树分析 实现最小高度树
2022/04/09 Javascript