国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

Laravel框架實現redis集群的方法分析

2024-05-05 00:00:07
字體:
來源:轉載
供稿:網友

本文實例講述了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/SessionIlluminate/Support/Facades/FacadeIlluminate/Session/Facade::app['session']->putIlluminate/Session/Facade::app['session']為Illuminate/Session/SessionManagerIlluminate/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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 德庆县| 昌乐县| 民县| 大理市| 宁明县| 莱阳市| 紫金县| 滦平县| 太湖县| 武城县| 陆川县| 鹤岗市| 翼城县| 高阳县| 马公市| 乐至县| 南木林县| 斗六市| 孝感市| 涟水县| 梅州市| 平塘县| 齐齐哈尔市| 清徐县| 通海县| 陆河县| 丹江口市| 璧山县| 同仁县| 车致| 门头沟区| 湟中县| 淄博市| 乾安县| 台中市| 安义县| 广宁县| 高青县| 弋阳县| 绥芬河市| 北辰区|