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 相关文章推荐
使用Apache的rewrite技术
Jun 22 PHP
vBulletin HACK----关于排版的两个HACK
Oct 09 PHP
解析Linux下Varnish缓存的配置优化
Jun 20 PHP
PHP生成Gif图片验证码
Oct 27 PHP
PHP中source #N问题的解决方法
Jan 27 PHP
php表单提交与$_POST实例分析
Jan 26 PHP
如何使用php实现评委评分器
Jul 31 PHP
利用php生成验证码
Feb 23 PHP
Laravel网站打开速度优化的方法汇总
Jul 16 PHP
Thinkphp开发--集成极光推送
Sep 15 PHP
Laravel中的Blade模板引擎示例详解
Oct 10 PHP
使用PHPStorm+XDebug搭建单步调试环境
Nov 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
全国FM电台频率大全 - 12 安徽省
2020/03/11 无线电
基于mysql的论坛(7)
2006/10/09 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
php操作mongodb封装类与用法实例
2018/09/01 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
2020/04/26 PHP
Javascript Global对象
2009/08/13 Javascript
JS 如果改变span标签的是否隐藏属性
2011/10/06 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
2012/08/09 Javascript
PHP中CURL的几个经典应用实例
2015/01/23 Javascript
JS实现可点击展开与关闭的左侧广告代码
2015/09/02 Javascript
jquery实现倒计时效果
2015/12/14 Javascript
js正则表达式replace替换变量方法
2016/05/21 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
深入理解ES6 Promise 扩展always方法
2017/09/26 Javascript
浅谈Vue-cli 命令行工具分析
2017/11/22 Javascript
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
nodejs实现聊天机器人功能
2019/09/19 NodeJs
vue 解除鼠标的监听事件的方法
2019/11/13 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
Django1.7+python 2.78+pycharm配置mysql数据库教程
2014/11/18 Python
python中使用xlrd、xlwt操作excel表格详解
2015/01/29 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
Python爬虫简单运用爬取代理IP的实现
2020/12/01 Python
Python 求向量的余弦值操作
2021/03/04 Python
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
一套软件测试笔试题
2014/07/25 面试题
2014两会优秀的心得体会范文
2014/03/17 职场文书
敬老院献爱心活动总结
2014/07/08 职场文书
学校推普周活动总结
2015/05/07 职场文书
入党积极分子党支部意见
2015/06/02 职场文书
2016年大学生社区服务活动总结
2016/04/06 职场文书