Laravel框架實(shí)現(xiàn)redis集群的方法分析
本文實(shí)例講述了Laravel框架實(shí)現(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,接下來(lái)就可以作集群使用了;
如果把session的driver設(shè)置為redis,則可以使用其集群功能了:
我們來(lái)看下session的實(shí)現(xiàn),當(dāng)我們?cè)诖a中這樣寫:
Session::put('test', 124);
實(shí)際的執(zhí)行流程是這樣的:
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會(huì)根據(jù)返回創(chuàng)建driver
$this->app['config']['session.driver']
即配置文件中配置的,這里我們配置為redis
Illuminate\Session\SessionManager::Illuminate\Session\SessionManager
最終由Illuminate\Session\Store來(lái)負(fù)責(zé)put的調(diào)用
而Store類負(fù)責(zé)存儲(chǔ)的類是Illuminate\Session\CacheBasedSessionHandler
后者又將請(qǐng)求轉(zhuǎn)發(fā)給$this->app['cache']->driver($driver)
……
經(jīng)過(guò)一系列代碼追查,存儲(chǔ)類為Predis\Client\Database,看其構(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))); }
這里會(huì)把所有服務(wù)器放在default組中
實(shí)際存數(shù)據(jù)的類是Predis\Client,這里有根據(jù)配置創(chuàng)建服務(wù)器的代碼,具體可以自己看下;
Predis\Cluster\PredisClusterHashStrategy類負(fù)責(zé)計(jì)算key的hash,關(guān)鍵函數(shù):
getHash
getKeyFromFirstArgument
而Predis\Cluster\Distribution\HashRing負(fù)責(zé)服務(wù)器環(huán)的維護(hù),關(guān)鍵函數(shù)
addNodeToRing
get
hash
大概原理是這樣,如執(zhí)行以下redis命令
get ok
會(huì)將ok作crc32運(yùn)算得到一個(gè)hash值
所有服務(wù)器按一定算法放到一個(gè)長(zhǎng)度默認(rèn)為128的數(shù)組中,每個(gè)服務(wù)器在其中占幾項(xiàng),由以下決定:
權(quán)重/總權(quán)重*總的服務(wù)器數(shù)量*128,可參考Predis\Cluster\Distribution\HashRing::addNodeToRing
方法
每一項(xiàng)的hash值是按服務(wù)器ip:端口的格式,作crc32計(jì)算的
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值也有了,服務(wù)器環(huán)也計(jì)算好了,剩下的就是查找了,二分法能較快的查找相應(yīng)的服務(wù)器節(jié)點(diǎn)
更多關(guān)于Laravel相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Laravel框架入門與進(jìn)階教程》、《php優(yōu)秀開(kāi)發(fā)框架總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家基于Laravel框架的PHP程序設(shè)計(jì)有所幫助。
- PHP的Laravel框架結(jié)合MySQL與Redis數(shù)據(jù)庫(kù)的使用部署
- Laravel框架使用Redis的方法詳解
- laravel使用Redis實(shí)現(xiàn)網(wǎng)站緩存讀取的方法詳解
- 關(guān)于 Laravel Redis 多個(gè)進(jìn)程同時(shí)取隊(duì)列問(wèn)題詳解
- Redis在Laravel項(xiàng)目中的應(yīng)用實(shí)例詳解
- Laravel如何使用Redis共享Session
- laravel配置Redis多個(gè)庫(kù)的實(shí)現(xiàn)方法
- Laravel的Auth驗(yàn)證Token驗(yàn)證使用自定義Redis的例子
- laravel項(xiàng)目利用twemproxy部署redis集群的完整步驟
- laravel中Redis隊(duì)列監(jiān)聽(tīng)中斷的分析
相關(guān)文章
CI框架源碼解讀之URI.php中_fetch_uri_string()函數(shù)用法分析
這篇文章主要介紹了CI框架源碼解讀之URI.php中_fetch_uri_string()函數(shù)用法,結(jié)合實(shí)例形式分析了CI框架中URL路由機(jī)制的原理與相關(guān)的config配置文件設(shè)置方法,需要的朋友可以參考下2016-05-05詳解PHP編碼轉(zhuǎn)換函數(shù)應(yīng)用技巧
在PHP語(yǔ)言中mb_convert_encoding是一個(gè)PHP編碼轉(zhuǎn)換函數(shù),可以幫助我們用來(lái)實(shí)現(xiàn)對(duì)多字節(jié)字符串編碼的轉(zhuǎn)換。下面將會(huì)為大家進(jìn)行詳細(xì)介紹。2016-10-10PHP未登錄自動(dòng)跳轉(zhuǎn)到登錄頁(yè)面
為了滿足用戶體驗(yàn)度,需要用戶登錄才能跳轉(zhuǎn)到頁(yè)面,這篇文章給大家分享PHP未登錄自動(dòng)跳轉(zhuǎn)到登錄頁(yè)面的實(shí)例代碼,需要的朋友參考下2016-12-12PHP經(jīng)典面試題之設(shè)計(jì)模式(經(jīng)常遇到)
php中設(shè)計(jì)模式非常多,但是設(shè)計(jì)模式在php面試題經(jīng)常會(huì)提到,本文主要給大家介紹php經(jīng)典面試題之設(shè)計(jì)模式,需要的朋友一起看看吧2015-10-10