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中比较两个字符串找出第一个不同字符位置例子
Apr 08 PHP
WordPress主题制作之模板文件的引入方法
Dec 28 PHP
PHP MYSQL实现登陆和模糊查询两大功能
Feb 05 PHP
php判断用户是否关注微信公众号
Jul 22 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
Oct 25 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
May 19 PHP
PHP图片水印类的封装
Jul 06 PHP
PHP操作Postgresql封装类与应用完整实例
Apr 24 PHP
PHP文件操作实例总结【文件上传、下载、分页】
Dec 08 PHP
PHP7内核CGI与FastCGI详解
Apr 14 PHP
laravel框架查询数据集转为数组的两种方法
Oct 10 PHP
Swoole扩展的6种模式深入详解
Mar 04 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电台频率大全 - 4 山西省
2020/03/11 无线电
修改PHP的memory_limit限制的方法分享
2012/02/21 PHP
PHP使用标准库spl实现的观察者模式示例
2018/08/04 PHP
基于dom编程中 动态创建与删除元素的使用
2013/04/17 Javascript
Extjs根据条件设置表格某行背景色示例
2014/07/23 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
2014/08/22 Javascript
10条建议帮助你创建更好的jQuery插件
2015/05/18 Javascript
jquery配合.NET实现点击指定绑定数据并且能够一键下载
2016/10/28 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
javaScript+turn.js实现图书翻页效果实例代码
2017/02/16 Javascript
Vue.Js中的$watch()方法总结
2017/03/23 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
2017/12/06 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
2018/01/06 jQuery
NodeJS实现不可逆加密与密码密文保存的方法
2018/03/16 NodeJs
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
通过javascript实现扫雷游戏代码实例
2020/02/09 Javascript
JS实现简单打字测试
2020/06/24 Javascript
Python httplib模块使用实例
2015/04/11 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
Python Print实现在输出中插入变量的例子
2019/12/25 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
2020/04/22 Python
基于selenium及python实现下拉选项定位select
2020/07/22 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
CSS3圆角和渐变2种常用功能详解
2016/01/06 HTML / CSS
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
印度服装购物网站:Limeroad
2018/09/26 全球购物
印尼综合在线预订网站:Tiket.com(机票、酒店、火车、租车和娱乐)
2018/10/11 全球购物
请写出char *p与"零值"比较的if语句
2014/09/24 面试题
一套带网友答案的.NET笔试题
2016/12/06 面试题
六查六看自查材料
2014/02/17 职场文书
2014年党支部承诺书
2014/05/30 职场文书
班级文化标语
2014/06/23 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL