如何在Laravel框架中實現(xiàn)一個redis集群?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),新沂企業(yè)網(wǎng)站建設(shè),新沂品牌網(wǎng)站建設(shè),網(wǎng)站定制,新沂網(wǎng)站建設(shè)報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,新沂網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。在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í)行流程是這樣的:
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會根據(jù)返回創(chuàng)建driver
$this->app['config']['session.driver']
即配置文件中配置的,這里我們配置為redis
Illuminate\Session\SessionManager::Illuminate\Session\SessionManager
最終由Illuminate\Session\Store來負責put的調(diào)用
而Store類負責存儲的類是Illuminate\Session\CacheBasedSessionHandler
后者又將請求轉(zhuǎn)發(fā)給$this->app['cache']->driver($driver)
……
經(jīng)過一系列代碼追查,存儲類為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))); }
這里會把所有服務器放在default組中
實際存數(shù)據(jù)的類是Predis\Client,這里有根據(jù)配置創(chuàng)建服務器的代碼,具體可以自己看下;
Predis\Cluster\PredisClusterHashStrategy類負責計算key的hash,關(guān)鍵函數(shù):
getHash
getKeyFromFirstArgument
而Predis\Cluster\Distribution\HashRing負責服務器環(huán)的維護,關(guān)鍵函數(shù)
addNodeToRing
get
hash
大概原理是這樣,如執(zhí)行以下redis命令
get ok
會將ok作crc32運算得到一個hash值
所有服務器按一定算法放到一個長度默認為128的數(shù)組中,每個服務器在其中占幾項,由以下決定:
權(quán)重/總權(quán)重*總的服務器數(shù)量*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; } }
看完上述內(nèi)容,你們掌握如何在Laravel框架中實現(xiàn)一個redis集群的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
當前名稱:如何在Laravel框架中實現(xiàn)一個redis集群-創(chuàng)新互聯(lián)
新聞來源:http://muchs.cn/article6/dcpoog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、網(wǎng)站維護、商城網(wǎng)站、做網(wǎng)站、網(wǎng)站排名、響應式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容