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 empty函数判断mysql表单是否为空
Apr 12 PHP
php下将图片以二进制存入mysql数据库中并显示的实现代码
May 27 PHP
PHP编码规范之注释和文件结构说明
Jul 09 PHP
PHP __autoload函数(自动载入类文件)的使用方法
Feb 04 PHP
PHP使用CURL获取302跳转后的地址实例
May 04 PHP
PHP中加密解密函数与DES加密解密实例
Oct 17 PHP
php实现读取内存顺序号
Mar 29 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
Dec 28 PHP
PHP实现伪静态方法汇总
Jan 13 PHP
浅谈PHP值mysql操作类
Jun 29 PHP
PHP有序表查找之插值查找算法示例
Feb 10 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
Oct 16 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中的array数组类型分析说明
2010/07/27 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
2012/09/23 PHP
ThinkPHP的Widget扩展实例
2014/06/19 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
window.returnValue使用方法示例介绍
2014/07/03 Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
2015/03/05 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
jQuery实现非常实用漂亮的select下拉菜单选择效果
2015/11/06 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
2016/04/27 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
JavaScript模块模式实例详解
2017/10/25 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
python局部赋值的规则
2013/03/07 Python
python使用socket远程连接错误处理方法
2015/04/29 Python
python中的代码编码格式转换问题
2015/06/10 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
Python实现调度算法代码详解
2017/12/01 Python
PYQT5 vscode联合操作qtdesigner的方法
2020/03/24 Python
pygame实现弹球游戏
2020/04/14 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
python中np是做什么的
2020/07/21 Python
python实现在列表中查找某个元素的下标示例
2020/11/16 Python
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
美国婴儿和儿童服装购物网站:PatPat
2020/10/01 全球购物
司仪主持词两篇
2014/03/22 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
毕业论文答辩开场白和结束语
2015/05/27 职场文书
《蚂蚁和蝈蝈》教学反思
2016/02/22 职场文书