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 相关文章推荐
PHP中的MYSQL常用函数(php下操作数据库必备)
Sep 12 PHP
PHP服务器页面间跳转实现方法
Aug 02 PHP
基于PHP中的常用函数回顾
Jul 11 PHP
php中explode函数用法分析
Nov 15 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
Dec 16 PHP
php正则替换处理HTML页面的方法
Jun 17 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
Dec 18 PHP
简单的pgsql pdo php操作类实现代码
Aug 25 PHP
php编程实现简单的网页版计算器功能示例
Apr 26 PHP
PHP 使用二进制保存用户状态的实例
Jan 29 PHP
php微信扫码支付 php公众号支付
Mar 24 PHP
php根据地址获取百度地图经纬度的实例方法
Sep 03 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
在PHP3中实现SESSION的功能(二)
2006/10/09 PHP
php中explode与split的区别介绍
2012/10/03 PHP
php遍历文件夹下的所有文件和子文件夹示例
2014/03/20 PHP
PHP实现合并discuz用户
2015/08/05 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
PHP http请求超时问题解决方案
2020/11/13 PHP
setAttribute 与 class冲突解决
2008/02/17 Javascript
javascript document.images实例
2008/05/27 Javascript
javascript延时加载之defer测试
2012/12/28 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
2014/04/04 Javascript
javascript实现分栏显示小技巧附图
2014/10/13 Javascript
在JS方法中返回多个值的方法汇总
2015/05/20 Javascript
浅谈Node.js 子进程与应用场景
2018/01/24 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
node基于puppeteer模拟登录抓取页面的实现
2018/05/09 Javascript
jQuery插件jsonview展示json数据
2018/05/26 jQuery
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
Python中datetime常用时间处理方法
2015/06/15 Python
利用nohup来开启python文件的方法
2019/01/14 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
2019/01/29 Python
Django中使用Whoosh进行全文检索的方法
2019/03/31 Python
python2和python3在处理字符串上的区别详解
2019/05/29 Python
python中时间、日期、时间戳的转换的实现方法
2019/07/06 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
2021/03/03 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
css3实现简单的白云飘动背景特效
2020/10/28 HTML / CSS
Belvilla德国:在线预订度假屋
2018/04/10 全球购物
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
TCP/IP中的TCP和IP分别承担什么责任
2012/04/21 面试题
创业计划书怎样才能打动风投
2014/01/01 职场文书
党员民主评议总结
2014/10/20 职场文书
个人作风建设心得体会
2014/10/22 职场文书
留学推荐信中文范文
2015/03/26 职场文书
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫
Python实现Hash算法
2022/03/18 Python