成人精品一区二区三区中文字幕-成人精品一区二区三区-成人精品一级毛片-成人精品亚洲-日本在线视频一区二区-日本在线视频免费

導航首頁 ? 技術(shù)教程 ? Laravel框架實現(xiàn)redis集群的方法分析
全站頭部文字 我要出現(xiàn)在這里
Laravel框架實現(xiàn)redis集群的方法分析 909 2023-12-10   

本文實例講述了Laravel框架實現(xiàn)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設(shè)置為redis,則可以使用其集群功能了:

我們來看下session的實現(xiàn),當我們在代碼中這樣寫:

Session::put('test', 124);

實際的執(zhí)行流程是這樣的:

IlluminateSupportFacadesSession
IlluminateSupportFacadesFacade
IlluminateSessionFacade::app['session']->put
IlluminateSessionFacade::app['session']為IlluminateSessionSessionManager
IlluminateSupportManager::__call

Session會根據(jù)返回創(chuàng)建driver

$this->app['config']['session.driver']

即配置文件中配置的,這里我們配置為redis

IlluminateSessionSessionManager::IlluminateSessionSessionManager

最終由IlluminateSessionStore來負責put的調(diào)用

而Store類負責存儲的類是IlluminateSessionCacheBasedSessionHandler

后者又將請求轉(zhuǎn)發(fā)給$this->app['cache']->driver($driver)
……
經(jīng)過一系列代碼追查,存儲類為PredisClientDatabase,看其構(gòu)造函數(shù):

public function __construct(array $servers = array())
{
    if (isset($servers['cluster']) && $servers['cluster'])
    {
      $this->clients = $this->createAggregateClient($servers);
    }
    else
    {
      $this->clients = $this->createSingleClients($servers);
    }
}

如果設(shè)置為集群,則調(diào)用createAggregateClient方法

protected function createAggregateClient(array $servers)
{
    $servers = array_except($servers, array('cluster'));
    return array('default' => new Client(array_values($servers)));
}

這里會把所有服務器放在default組中

實際存數(shù)據(jù)的類是PredisClient,這里有根據(jù)配置創(chuàng)建服務器的代碼,具體可以自己看下;

PredisClusterPredisClusterHashStrategy類負責計算key的hash,關(guān)鍵函數(shù):

getHash

getKeyFromFirstArgument

而PredisClusterDistributionHashRing負責服務器環(huán)的維護,關(guān)鍵函數(shù)

addNodeToRing

get

hash

大概原理是這樣,如執(zhí)行以下redis命令

get ok

會將ok作crc32運算得到一個hash值

所有服務器按一定算法放到一個長度默認為128的數(shù)組中,每個服務器在其中占幾項,由以下決定:

權(quán)重/總權(quán)重*總的服務器數(shù)量*128,可參考PredisClusterDistributionHashRing::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值也有了,服務器環(huán)也計算好了,剩下的就是查找了,二分法能較快的查找相應的服務器節(jié)點

更多關(guān)于Laravel相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Laravel框架入門與進階教程》、《php優(yōu)秀開發(fā)框架總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對大家基于Laravel框架的PHP程序設(shè)計有所幫助。


主站蜘蛛池模板: cctv17农业农村频道在线直播| 2023大湾区音乐会节目单| 电影《男宠》在线观看| 性行| 铠甲勇士第六部| 隐形人4| 瑜伽焰口全集 简体字| 小小少年电影简介| 改病句| 狂野殴美激情性bbbbbb| 大秦帝国第一部免费看| 消防给水及消火栓系统技术规范 | 有完没完电影| 今年过年时间| 潘霜霜惊艳写真照| 香帅传奇| 爱播| 泰星mike| 代高政最新短剧| 深圳古镇| 胖女人做爰全过程免费的视频| 猎奇头像| 网络谜踪2 电影| 小林凉子| 色戒在线观| 天下第一楼剧情介绍| 短篇500篇 合集大结局| 寡妇一级毛片免费看| 日本女人裸体照| 姬培杰| 徐情| 涡轮增压黄鹤楼| 河北电视台| 贴身情人之贴身恋李华月| 少年智力开发报| 我们的快乐人生 电视剧| 奔跑吧第13季| 哑妻| 祈今朝 电视剧| 洞房艳谭电影| 韩国电影女儿的朋友4|

!!!站長長期在線接!!!

網(wǎng)站、小程序:定制開發(fā)/二次開發(fā)/仿制開發(fā)等

各種疑難雜癥解決/定制接口/定制采集等

站長微信:lxwl520520

站長QQ:1737366103