如何在Laravel框架中實現一個redis集群-創新互聯

如何在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;
    }
}

看完上述內容,你們掌握如何在Laravel框架中實現一個redis集群的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創新互聯行業資訊頻道,感謝各位的閱讀!

當前名稱:如何在Laravel框架中實現一個redis集群-創新互聯
新聞來源:http://m.kartarina.com/article6/dcpoog.html

成都網站建設公司_創新互聯,為您提供軟件開發網站維護商城網站做網站網站排名響應式網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

微信小程序開發
主站蜘蛛池模板: 亚洲综合无码一区二区痴汉| 亚洲成av人无码亚洲成av人| 国产精品多人p群无码| 久久ZYZ资源站无码中文动漫| 亚洲中文无码亚洲人成影院| 内射人妻无码色AV天堂| 精品久久久无码21p发布| 中文字幕丰满乱孑伦无码专区| 爆乳无码AV一区二区三区| 无码人妻精品一区二区三区夜夜嗨 | 久久久精品人妻无码专区不卡| 亚洲av无码国产综合专区| 欧日韩国产无码专区| 日韩乱码人妻无码中文视频 | 人妻夜夜添夜夜无码AV| 人妻老妇乱子伦精品无码专区| 无遮掩无码h成人av动漫| 国产精品无码日韩欧| 国产av无码久久精品| 亚洲 无码 在线 专区| 亚洲av无码专区在线电影| 久久久久久精品无码人妻| 久久久久亚洲AV成人无码| 亚洲AV无码不卡在线播放| 夜夜精品无码一区二区三区| 乱人伦人妻中文字幕无码| 久久人妻少妇嫩草AV无码专区 | 亚洲AⅤ永久无码精品AA| 久久精品无码一区二区三区免费| 久久精品国产亚洲AV无码偷窥 | 国产精品无码不卡一区二区三区| 黄色成人网站免费无码av| 92午夜少妇极品福利无码电影| 无码无需播放器在线观看| 亚洲成无码人在线观看| 亚洲AV色吊丝无码| 亚洲av永久无码| 无码日韩精品一区二区人妻| 亚洲AⅤ永久无码精品AA| 精品久久久久久无码中文字幕| 久久久久亚洲?V成人无码|