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项目的方法
Oct 09 PHP
通过对服务器端特性的配置加强php的安全
Oct 09 PHP
UCenter中的一个可逆加密函数authcode函数代码
Jul 20 PHP
检测png图片是否完整的php代码
Sep 06 PHP
用PHP编写和读取XML的几种方式
Jan 12 PHP
php实现的简单中文验证码功能示例
Jan 03 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
Oct 23 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
PHP排序二叉树基本功能实现方法示例
May 26 PHP
php/JS实现的生成随机密码(验证码)功能示例
Jun 06 PHP
laravel按天、按小时,查询数据的实例
Oct 09 PHP
php post换行的方法
Feb 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
php获取服务器信息的实现代码
2013/02/04 PHP
PHP 5.5 创建和验证哈希最简单的方法详解
2013/11/07 PHP
php获取汉字首字母的函数
2013/11/07 PHP
php通过文件头判断格式的方法
2016/05/28 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
3款实用的在线JS代码工具(国外)
2012/03/15 Javascript
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
Js+Jq获取URL参数的集中方法示例代码
2014/05/20 Javascript
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
2017/02/20 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
IntelliJ IDEA编辑器配置vue高亮显示
2019/09/26 Javascript
IDEA安装vue插件图文详解
2019/09/26 Javascript
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
pycharm 使用心得(三)Hello world!
2014/06/05 Python
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
pyqt5简介及安装方法介绍
2018/01/31 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
python实现图片中文字分割效果
2019/07/22 Python
应用OpenCV和Python进行SIFT算法的实现详解
2019/08/21 Python
关于Python3 lambda函数的深入浅出
2019/11/27 Python
python下对hsv颜色空间进行量化操作
2020/06/04 Python
Python reques接口测试框架实现代码
2020/07/28 Python
TensorFlow低版本代码自动升级为1.0版本
2021/02/20 Python
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
酒店个人培训自我鉴定
2013/12/11 职场文书
营销总经理的岗位职责
2013/12/15 职场文书
学生操行评语大全
2014/04/24 职场文书
学校安全管理责任书
2014/07/23 职场文书
尊师重教演讲稿
2014/09/04 职场文书
免职通知
2015/04/23 职场文书
pytorch 中nn.Dropout的使用说明
2021/05/20 Python
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL