日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

隨著業(yè)務(wù)規(guī)模的擴(kuò)大,數(shù)據(jù)庫所需處理的數(shù)據(jù)量也不斷增加,導(dǎo)致單一數(shù)據(jù)庫面臨著壓力。這時(shí)候我們就需要進(jìn)行數(shù)據(jù)庫水平分庫操作,將數(shù)據(jù)分散到不同的數(shù)據(jù)庫中,從而提高系統(tǒng)的性能和可擴(kuò)展性。本文將介紹在ThinkPHP6中如何進(jìn)行數(shù)據(jù)庫水平分庫操作。

一、什么是數(shù)據(jù)庫水平分庫?

數(shù)據(jù)庫水平分庫是將一個(gè)數(shù)據(jù)庫中的數(shù)據(jù)分散到多個(gè)數(shù)據(jù)庫中的過程。我們可以將數(shù)據(jù)按照某種規(guī)則(比如按照用戶ID或時(shí)間段)劃分到不同的數(shù)據(jù)庫中,從而降低單一數(shù)據(jù)庫的負(fù)載壓力。同時(shí),在數(shù)據(jù)量大的情況下,水平分庫還能提高查詢效率,增強(qiáng)數(shù)據(jù)安全性。

二、ThinkPHP6中水平分庫的實(shí)現(xiàn)

在ThinkPHP6中,我們可以通過使用數(shù)據(jù)庫中間件的方式來實(shí)現(xiàn)水平分庫。 將數(shù)據(jù)庫中間件放在ThinkPHP6的MySQL連接中,用于控制分庫。

    安裝Thinkswoole

在ThinkPHP6中,采用Thinkswoole作為數(shù)據(jù)庫中間件。我們需要在項(xiàng)目中安裝Thinkswoole。

在composer.json文件中加入ThinkSwoole的版本信息,然后使用composer進(jìn)行安裝。

    修改數(shù)據(jù)庫配置

首先找到config/database.php文件,將MySQL連接替換成Swoole連接。注釋掉原來的MySQL連接信息:

// 'mysql' => [
    //     // 默認(rèn)數(shù)據(jù)連接標(biāo)識
    //     'default' => env('database.driver', 'mysql'),
    //     // 數(shù)據(jù)庫連接信息
    //     'connections' => [
    //         'mysql' => [
    //             // 數(shù)據(jù)庫類型
    //             'type' => 'mysql',
    //             // 主機(jī)地址
    //             'host' => env('database.hostname', '127.0.0.1'),
    //             // 數(shù)據(jù)庫名
    //             'database' => env('database.database', ''),
    //             // 用戶名
    //             'username' => env('database.username', 'root'),
    //             // 密碼
    //             'password' => env('database.password', ''),
    //             // 端口
    //             'hostport' => env('database.hostport', '3306'),
    //             // 數(shù)據(jù)庫連接參數(shù)
    //             'params' => [],
    //             // 數(shù)據(jù)庫編碼默認(rèn)采用utf8
    //             'charset' => 'utf8',
    //             // 數(shù)據(jù)庫表前綴
    //             'prefix' => env('database.prefix', ''),
    //             // 數(shù)據(jù)庫調(diào)試模式
    //             'debug' => env('database.debug', true),
    //             // 數(shù)據(jù)庫部署方式:0 集中式(單一服務(wù)器),1 分布式(主從服務(wù)器)
    //             'deploy' => 0,
    //             // 數(shù)據(jù)庫讀寫是否分離 主從式有效
    //             'rw_separate' => false,
    //             // 讀寫分離后 主服務(wù)器數(shù)量
    //             'master_num' => 1,
    //             // 指定從服務(wù)器序號
    //             'slave_no' => '',
    //             // 是否嚴(yán)格檢查字段是否存在
    //             'fields_strict' => true,
    //             // 數(shù)據(jù)集返回類型
    //             'resultset_type' => 'array',
    //             // 自動寫入時(shí)間戳字段
    //             'auto_timestamp' => false,
    //             // 時(shí)間字段取出后的默認(rèn)時(shí)間格式
    //             'datetime_format' => false,
    //             // Builder類
    //             'builder' => '',
    //             // Query類
    //             'query' => '\think\db\Query',
    //             // 是否需要進(jìn)行SQL性能分析
    //             'sql_explain' => false,
    //         ],
    //     ],
    // ],

登錄后復(fù)制

添加Swoole連接信息:

 // swoole
    'swoole' => [
        // 默認(rèn)數(shù)據(jù)連接標(biāo)識
        'default' => 'swoole',
        // 數(shù)據(jù)庫連接信息
        'connections' => [
            'swoole' => [
                // 數(shù)據(jù)庫類型
                'type' => 'mysql',
                // 服務(wù)器地址
                'hostname' => [
                    '127.0.0.1:3305',
                    '127.0.0.1:3306',
                ],
                // 數(shù)據(jù)庫名
                'database' => 'test',
                // 用戶名
                'username' => 'root',
                // 密碼
                'password' => '',
                // 端口
                'hostport' => '',
                // 數(shù)據(jù)庫連接參數(shù)
                'params' => [],
                // 數(shù)據(jù)庫編碼默認(rèn)采用utf8mb4
                'charset' => 'utf8mb4',
                // 數(shù)據(jù)庫表前綴
                'prefix' => '',
                // 數(shù)據(jù)庫調(diào)試模式
                'debug' => true,
                // 數(shù)據(jù)庫部署方式:0 集中式(單一服務(wù)器),1 分布式(主從服務(wù)器)
                'deploy' => 0,
                // 數(shù)據(jù)庫讀寫是否分離 主從式有效
                'rw_separate' => false,
                // 讀寫分離后 主服務(wù)器數(shù)量
                'master_num' => 1,
                // 指定從服務(wù)器序號
                'slave_no' => '',
                // 自動寫入時(shí)間戳字段
                'auto_timestamp' => false,
                // 時(shí)間字段取出后的默認(rèn)時(shí)間格式
                'datetime_format' => 'Y-m-d H:i:s',
                // Builder類
                'builder' => '',
                // Query類
                'query' => '\think\db\Query',
                // 是否需要進(jìn)行SQL性能分析
                'sql_explain' => false,
            ],
        ],
    ],

登錄后復(fù)制

上述代碼中,我們定義了兩個(gè)服務(wù)器地址(127.0.0.1:3305和127.0.0.1:3306),這是為了實(shí)現(xiàn)多數(shù)據(jù)節(jié)點(diǎn)的分庫。數(shù)據(jù)庫名、用戶名、密碼等信息不變。

    創(chuàng)建數(shù)據(jù)庫中間件

在app/middleware目錄下創(chuàng)建Db.php的數(shù)據(jù)庫中間件,添加以下代碼:

<?php
namespace appmiddleware;

use thinkRequest;
use thinkContainer;

class Db
{
    public function handle(Request $request, Closure $next)
    {
        $serverIds = $this->getServerIds($request);
        //定義一個(gè)連接池
        $conns = [];
        foreach($serverIds as $sid) {
            $sid = $request->$sid;
            if(empty($conns[$sid])) {
                $conns[$sid] = Container::getInstance()
                                         ->make('db')->connect($sid);
            }
        }
        Container::getInstance()->bind('db', function() use ($conns) {
            return $conns;
        });
        return $next($request);
    }

    protected function getServerIds(Request $request)
    {
        return ['uid'];
    }
}

登錄后復(fù)制

這里創(chuàng)建了一個(gè)名為Db的中間件。在handle方法中,首先獲取當(dāng)前請求的服務(wù)器ID數(shù)組。然后依次將這些服務(wù)器地址與連接池$cons中已有的地址比較,如果不存在就加入連接池中。最后將連接池$conns綁定到容器實(shí)例中。在getServerIds方法中,我們可以設(shè)置服務(wù)器ID的名稱,這里默認(rèn)為uid。

    注冊中間件

在config/middleware.php中加入以下代碼:

return [
    ...
    appmiddlewareDb::class,
];

登錄后復(fù)制

這段代碼是用來注冊中間件的,在中間件執(zhí)行活動列表中添加了我們的Db中間件。

    實(shí)現(xiàn)分庫操作

接下來,我們將實(shí)現(xiàn)在模型中水平分庫操作。這里以用戶表為例,將用戶ID以10萬為一個(gè)庫的界限進(jìn)行分片操作,表示用戶ID在0-10萬之間的數(shù)據(jù)存儲在一個(gè)數(shù)據(jù)庫里,以此類推,直到將用戶ID在90萬-100萬之間的數(shù)據(jù)存儲在第10個(gè)數(shù)據(jù)庫里。

<?php
namespace appmodel;

use thinkModel;

class User extends Model
{
    protected $connection = [
        1 => 'user_1',
        2 => 'user_2',
        3 => 'user_3',
        4 => 'user_4',
        5 => 'user_5',
        6 => 'user_6',
        7 => 'user_7',
        8 => 'user_8',
        9 => 'user_9',
        10 => 'user_10',
    ];

    protected $pk = 'uid';

    public function getTableName(): string
    {
        $id = ceil($this->id / 100000);
        return $this->connection[$id] . '.' . $this->table;
    }
}

登錄后復(fù)制

這里我們定義了10個(gè)數(shù)據(jù)庫連接,每個(gè)連接表示一個(gè)數(shù)據(jù)庫分片,實(shí)現(xiàn)了水平分庫的目的。接著我們定義getTableName方法,用于獲取當(dāng)前模型對應(yīng)的數(shù)據(jù)表名。根據(jù)模型中的主鍵ID值計(jì)算出需要訪問的數(shù)據(jù)庫連接,返回?cái)?shù)據(jù)庫連接和數(shù)據(jù)表名稱的組合。

總結(jié):

本文介紹了在ThinkPHP6中的水平分庫操作。隨著業(yè)務(wù)的不斷擴(kuò)展和數(shù)據(jù)規(guī)模的增加,水平分庫可以提高系統(tǒng)的性能和可擴(kuò)展性,以及增強(qiáng)數(shù)據(jù)安全性。在ThinkPHP6中可以使用Thinkswoole中間件等方法實(shí)現(xiàn)水平分庫操作。

以上就是怎樣在ThinkPHP6中進(jìn)行數(shù)據(jù)庫水平分庫操作?的詳細(xì)內(nèi)容,更多請關(guān)注www.xfxf.net其它相關(guān)文章!

分享到:
標(biāo)簽:thinkphp 數(shù)據(jù)庫分庫 水平分庫
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定