分庫分表 21 招

来源:https://www.cnblogs.com/88223100/archive/2023/06/24/21-bidding-for-database-and-table-division.html
-Advertisement-
Play Games

(一)好好的系統,為什麼要分庫分表? 咱們先介紹下在分庫分表架構實施過程中,會接觸到的一些通用概念,瞭解這些概念能夠幫助理解市面上其他的分庫分表工具,儘管它們的實現方法可能存在差異,但整體思路基本一致。因此,在開始實際操作之前,我們有必要先掌握這些通用概念,以便更好地理解和應用分庫分表技術。 我們結 ...


(一)好好的系統,為什麼要分庫分表?

咱們先介紹下在分庫分表架構實施過程中,會接觸到的一些通用概念,瞭解這些概念能夠幫助理解市面上其他的分庫分表工具,儘管它們的實現方法可能存在差異,但整體思路基本一致。因此,在開始實際操作之前,我們有必要先掌握這些通用概念,以便更好地理解和應用分庫分表技術。

我們結合具體業務場景,以t_order表為例進行架構優化。由於數據量已經達到億級別,查詢性能嚴重下降,因此我們採用了分庫分表技術來處理這個問題。具體而言,我們將原本的單庫分成了兩個庫,分別為DB_1DB_2,併在每個庫中再次進行分表處理,生成t_order_1t_order_2兩張表,實現對訂單表的分庫分表處理。

圖片

數據分片

通常我們在提到分庫分表的時候,大多是以水平切分模式(水平分庫、分表)為基礎來說的,數據分片它將原本一張數據量較大的表 t_order 拆分生成數個表結構完全一致的小數據量表(拆分表) t_order_0t_order_1、···、t_order_n,每張表只存儲原大表中的一部分數據。

圖片

數據節點

數據節點是數據分片中一個不可再分的最小單元(表),它由數據源名稱和數據表組成,例如上圖中 DB_1.t_order_1DB_2.t_order_2 就表示一個數據節點。

圖片

邏輯表

邏輯表是指具有相同結構的水平拆分表的邏輯名稱。

比如我們將訂單表t_order 分表拆分成 t_order_0 ··· t_order_9等10張表,這時我們的資料庫中已經不存在 t_order這張表,取而代之的是若幹的t_order_n表。

分庫分表通常對業務代碼都是無侵入式的,開發者只專註於業務邏輯SQL編碼,我們在代碼中SQL依然按 t_order來寫,而在執行邏輯SQL前將其解析成對應的資料庫真實執行的SQL。此時 t_order 就是這些拆分表的邏輯表

業務邏輯SQL

select * from t_order where order_no='A11111'

真實執行SQL

select * from DB_1.t_order_n where order_no='A11111'

真實表

真實表就是在資料庫中真實存在的物理表DB_1.t_order_n

圖片

廣播表

廣播表是一類特殊的表,其表結構和數據在所有分片數據源中均完全一致。與拆分表相比,廣播表的數據量較小、更新頻率較低,通常用於字典表或配置表等場景。由於其在所有節點上都有副本,因此可以大大降低JOIN關聯查詢的網路開銷,提高查詢效率。

需要註意的是,對於廣播表的修改操作需要保證同步性,以確保所有節點上的數據保持一致。

廣播表的特點

  • 在所有分片數據源中,廣播表的數據完全一致。因此,對廣播表的操作(如插入、更新和刪除)會實時在每個分片數據源中執行一遍,以保證數據的一致性。

  • 對於廣播表的查詢操作,僅需要在任意一個分片數據源中執行一次即可。

  • 與任何其他表進行JOIN操作都是可行的,因為由於廣播表的數據在所有節點上均一致,所以可以訪問到任何一個節點上的相同數據。

什麼樣的表可以作為廣播表呢?

訂單管理系統中,往往需要查詢統計某個城市地區的訂單數據,這就會涉及到省份地區表t_city與訂單流水錶DB_n.t_order_n進行JOIN查詢,因此可以考慮將省份地區表設計為廣播表,核心理念就是避免跨庫JOIN操作

圖片

註意:上邊我們提到廣播表在數據插入、更新與刪除會實時在每個分片數據源均執行,也就是說如果你有1000個分片數據源,那麼修改一次廣播表就要執行1000次SQL,所以儘量不在併發環境下和業務高峰時進行,以免影響系統的性能。

單表

單表指所有的分片數據源中僅唯一存在的表(沒有分片的表),適用於數據量不大且無需分片的表。

如果一張表的數據量預估在千萬級別,且沒有與其他拆分表進行關聯查詢的需求,建議將其設置為單表類型,存儲在預設分片數據源中。

分片鍵

分片鍵決定了數據落地的位置,也就是數據將會被分配到哪個數據節點上存儲。因此,分片鍵的選擇非常重要。

比如我們將 t_order 表進行分片後,當插入一條訂單數據執行SQL時,需要通過解析SQL語句中指定的分片鍵來計算數據應該落在哪個分片中。以表中order_no欄位為例,我們可以通過對其取模運算(比如 order_no % 2)來得到分片編號,然後根據分片編號分配數據到對應的資料庫實例(比如 DB_1 和 DB_2)。拆分表也是同理計算。

在這個過程中,order_no 就是 t_order 表的分片鍵。也就是說,每一條訂單數據的 order_no 值決定了它應該存放的資料庫實例和表。選擇一個適合作為分片鍵的欄位可以更好地利用水平分片帶來的性能提升。

圖片

這樣同一個訂單的相關數據就會落在同一個資料庫、表中,查詢訂單時同理計算,就可直接定位數據位置,大幅提升數據檢索的性能,避免了全庫表掃描。

不僅如此 ShardingSphere 還支持根據多個欄位作為分片健進行分片,這個在後續對應章節中會詳細講。

分片策略

分片策略來指定使用哪種分片演算法、選擇哪個欄位作為分片鍵以及如何將數據分配到不同的節點上。

分片策略是由分片演算法分片健組合而成,分片策略中可以使用多種分片演算法和對多個分片鍵進行運算。

圖片

分庫、分表的分片策略配置是相對獨立的,可以各自使用不同的策略與演算法,每種策略中可以是多個分片演算法的組合,每個分片演算法可以對多個分片健做邏輯判斷。

分片演算法

分片演算法則是用於對分片鍵進行運算,將數據劃分到具體的數據節點中。

常用的分片演算法有很多:

  • 哈希分片:根據分片鍵的哈希值來決定數據應該落到哪個節點上。例如,根據用戶 ID 進行哈希分片,將屬於同一個用戶的數據分配到同一個節點上,便於後續的查詢操作。
  • 範圍分片:分片鍵值按區間範圍分配到不同的節點上。例如,根據訂單創建時間或者地理位置來進行分片。
  • 取模分片:將分片鍵值對分片數取模,將結果作為數據應該分配到的節點編號。例如, order_no % 2 將訂單數據分到兩個節點之一。
  • .....

實際業務開發中分片的邏輯要複雜的多,不同的演算法適用於不同的場景和需求,需要根據實際情況進行選擇和調整。

綁定表

綁定表是那些具有相同分片規則的一組分片表,由於分片規則一致所產生的的數據落地位置相同,在JOIN聯合查詢時能有效避免跨庫操作。

比如:t_order 訂單表和 t_order_item 訂單項目表,都以 order_no 欄位作為分片鍵,並且使用 order_no 進行關聯,因此兩張表互為綁定表關係。

使用綁定表進行多表關聯查詢時,必須使用分片鍵進行關聯,否則會出現笛卡爾積關聯或跨庫關聯,從而影響查詢效率。

當使用 t_order 和 t_order_item 表進行多表聯合查詢,執行如下聯合查詢的邏輯SQL。

SELECT * FROM t_order o JOIN t_order_item i ON o.order_no=i.order_no

如果不配置綁定表關係,兩個表的數據位置不確定就會全庫表查詢,出現笛卡爾積關聯查詢,將產生如下四條SQL

SELECT * FROM t_order_0 o JOIN t_order_item_0 i ON o.order_no=i.order_no 
SELECT * FROM t_order_0 o JOIN t_order_item_1 i ON o.order_no=i.order_no 
SELECT * FROM t_order_1 o JOIN t_order_item_0 i ON o.order_no=i.order_no 
SELECT * FROM t_order_1 o JOIN t_order_item_1 i ON o.order_no=i.order_no
圖片

而配置綁定表關係後再進行關聯查詢時,分片規則一致產生的數據就會落到同一個庫表中,那麼只需在當前庫中 t_order_n 和 t_order_item_n 表關聯即可。

SELECT * FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id 
SELECT * FROM t_order_1 o JOIN t_order_item_1 i ON o.order_id=i.order_id 
圖片

註意:在關聯查詢時 t_order 它作為整個聯合查詢的主表。所有相關的路由計算都只使用主表的策略,t_order_item 表的分片相關的計算也會使用 t_order 的條件,所以要保證綁定表之間的分片鍵要完全相同。

SQL 解析

分庫分表後在應用層面執行一條 SQL 語句時,通常需要經過以下六個步驟:SQL 解析 -> 執⾏器優化 -> SQL 路由 -> SQL 改寫 -> SQL 執⾏ -> 結果歸併 。

圖片
在這裡插入圖片描述

SQL解析過程分為詞法解析語法解析兩步,比如下邊查詢用戶訂單的SQL,先用詞法解析將這條SQL拆解成不可再分的原子單元。在根據不同資料庫方言所提供的字典,將這些單元歸類為關鍵字,表達式,變數或者操作符等類型。

SELECT order_no FROM t_order where  order_status > 0  and user_id = 10086 

接著語法解析會將拆分後的SQL關鍵字轉換為抽象語法樹,通過對抽象語法樹遍歷,提煉出分片所需的上下文,上下文包含查詢欄位信息(Field)、表信息(Table)、查詢條件(Condition)、排序信息(Order By)、分組信息(Group By)以及分頁信息(Limit)等,並標記出 SQL中有可能需要改寫的位置。

圖片
抽象語法樹

執⾏器優化

執⾏器優化是根據SQL查詢特點和執行統計信息,選擇最優的查詢計劃並執行,比如user_id欄位有索引,那麼會調整兩個查詢條件的位置,主要是提高SQL的執行效率。

SELECT order_no FROM t_order where user_id = 10086 and order_status > 0

SQL 路由

通過上邊的SQL解析得到了分片上下文數據,在匹配用戶配置的分片策略和演算法,就可以運算生成路由路徑,將 SQL 語句路由到相應的數據節點上。

簡單點理解就是拿到分片策略中配置的分片鍵等信息,在從SQL解析結果中找到對應分片鍵欄位的值,計算出 SQL該在哪個庫的哪個表中執行,SQL路由又根據有無分片健分為 分片路由 和 廣播路由

圖片

有分⽚鍵的路由叫分片路由,細分為直接路由、標準路由和笛卡爾積路由這3種類型。

標準路由

標準路由是最推薦也是最為常⽤的分⽚⽅式,它的適⽤範圍是不包含關聯查詢或僅包含綁定表之間關聯查詢的SQL。

當 SQL分片健的運算符為 = 時,路由結果將落⼊單庫(表),當分⽚運算符是 BETWEEN 或 IN 等範圍時,路由結果則不⼀定落⼊唯⼀的庫(表),因此⼀條邏輯SQL最終可能被拆分為多條⽤於執⾏的真實SQL。

SELECT * FROM t_order  where t_order_id in (1,2)

SQL路由處理後

SELECT * FROM t_order_0  where t_order_id in (1,2)
SELECT * FROM t_order_1  where t_order_id in (1,2)

直接路由

直接路由是直接將SQL路由到指定⾄庫、表的一種分⽚方式,而且直接路由可以⽤於分⽚鍵不在SQL中的場景,還可以執⾏包括⼦查詢、⾃定義函數等複雜情況的任意SQL。

笛卡爾積路由

笛卡爾路由是由⾮綁定表之間的關聯查詢產生的,比如訂單表t_order 分片鍵是t_order_id 和用戶表t_user分片鍵是t_order_id ,兩個表的分片鍵不同,要做聯表查詢,會執行笛卡爾積路由,查詢性能較低儘量避免走此路由模式。

SELECT * FROM t_order_0 t LEFT JOIN t_user_0 u ON u.user_id = t.user_id WHERE t.user_id = 1
SELECT * FROM t_order_0 t LEFT JOIN t_user_1 u ON u.user_id = t.user_id WHERE t.user_id = 1
SELECT * FROM t_order_1 t LEFT JOIN t_user_0 u ON u.user_id = t.user_id WHERE t.user_id = 1
SELECT * FROM t_order_1 t LEFT JOIN t_user_1 u ON u.user_id = t.user_id WHERE t.user_id = 1

無分⽚鍵的路由又叫做廣播路由,可以劃分為全庫表路由、全庫路由、 全實例路由、單播路由和阻斷路由這 5種類型。

全庫表路由

全庫表路由針對的是資料庫 DQL 和 DML,以及 DDL等操作,當我們執行一條邏輯表 t_order SQL時,在所有分片庫中對應的真實表 t_order_0 ···  t_order_n 內逐一執行。

全庫路由

全庫路由主要是對資料庫層面的操作,比如資料庫 SET 類型的資料庫管理命令,以及 TCL 這樣的事務控制語句。

對邏輯庫設置 autocommit 屬性後,所有對應的真實庫中都執行該命令。

SET autocommit=0;

全實例路由

全實例路由是針對資料庫實例的 DCL 操作(設置或更改資料庫用戶或角色許可權),比如:創建一個用戶 order ,這個命令將在所有的真實庫實例中執行,以此確保 order 用戶可以正常訪問每一個資料庫實例。

CREATE USER [email protected] identified BY '程式員小富';

單播路由

單播路由用來獲取某一真實表信息,比如獲得表的描述信息:

DESCRIBE t_order; 

t_order 的真實表是 t_order_0 ···· t_order_n,他們的描述結構相完全同,我們只需在任意的真實表執行一次就可以。

阻斷路由

⽤來屏蔽SQL對資料庫的操作,例如:

USE order_db;

這個命令不會在真實資料庫中執⾏,因為 ShardingSphere 採⽤的是邏輯 Schema(資料庫的組織和結構) ⽅式,所以無需將切換資料庫的命令發送⾄真實資料庫中。

SQL 改寫

SQL經過解析、優化、路由後已經明確分片具體的落地執行的位置,接著就要將基於邏輯表開發的SQL改寫成可以在真實資料庫中可以正確執行的語句。比如查詢 t_order 訂單表,我們實際開發中 SQL是按邏輯表 t_order 寫的。

SELECT * FROM t_order

這時需要將分表配置中的邏輯表名稱改寫為路由之後所獲取的真實表名稱。

SELECT * FROM t_order_n

SQL執⾏

將路由和改寫後的真實 SQL 安全且高效發送到底層數據源執行。但這個過程並不能將 SQL 一股腦的通過 JDBC 直接發送至數據源執行,需平衡數據源連接創建以及記憶體占用所產生的消耗,它會自動化的平衡資源控制與執行效率。

結果歸併

將從各個數據節點獲取的多數據結果集,合併成一個大的結果集並正確的返回至請求客戶端,稱為結果歸併。而我們SQL中的排序、分組、分頁和聚合等語法,均是在歸併後的結果集上進行操作的。

分散式主鍵

數據分⽚後,一個邏輯表(t_order)對應諸多的真實表(t_order_n),它們之間由於⽆法互相感知,主鍵ID都從初始值累加,所以必然會產⽣重覆主鍵ID,此時主鍵不再唯一那麼對於業務來說也就沒意義了。

圖片

儘管可通過設置表⾃增主鍵 初始值 和 步⻓ 的⽅式避免ID碰撞,但這樣會使維護成本加大,可擴展性差。

這個時候就需要我們手動為一條數據記錄,分配一個全局唯一的ID,這個ID被叫做分散式ID,而生產這個ID的系統通常被叫做發號器。

大家可以參考我之前發佈的這篇文章 9種分散式ID生成方案

數據脫敏

分庫分表數據脫敏是一種有效的數據保護措施,可以確保敏感數據的機密性和安全性,減少數據泄露的風險。

比如,我們在分庫分表時可以指定表的哪些欄位為脫敏列,並設置對應的脫敏演算法,在數據分片時解析到執行SQL中有待脫敏欄位,會直接將欄位值脫敏後的寫入庫表內。

對於用戶的個人信息,如姓名、地址和電話號碼等,可以通過加密、隨機化或替換成偽隨機數據的方式進行脫敏,以確保用戶的隱私得到保護。

大家可以參考我之前發佈的這篇文章 大廠也在用的 6種 數據脫敏方案

分散式事務

分散式事務的核心問題是如何實現跨多個數據源的原子性操作。

由於不同的服務通常會使用不同的數據源來存儲和管理數據,因此,跨數據源的操作可能會導致數據不一致性或丟失的風險。因此,保證分散式事務的一致性是非常重要的。

以訂單系統為例,它需要調用支付系統、庫存系統、積分系統等多個系統,而每個系統都維護自己的資料庫實例,系統間通過API介面交換數據。

圖片

為了保證下單後多個系統同時調用成功,可以使用強一致性事務的XA協議,或者柔性事務的代表工具Seata,來實現分散式事務的一致性。這些工具可以幫助開發人員簡化分散式事務的實現,減少錯誤和漏洞的出現,提高系統的穩定性和可靠性。

經過分庫分表之後,問題的難度進一步提升。自身訂單服務,也需要處理跨數據源的操作。這樣一來,系統的複雜度顯著增加。因此,不到萬不得已的情況下,最好避免採用分庫分表的解決方案。

圖片

關於分散式事務詳細的介紹,大家可以參考我之前發佈的這篇文章 對比 5 種分散式事務方案,還是寵幸了阿裡的 Seata(原理 + 實戰)

數據遷移

分庫分表後還有個讓人頭疼的問題,那就是數據遷移,為了不影響現有的業務系統,通常會新建資料庫集群遷移數據。將數據從舊集群的資料庫、表遷移到新集群的分庫、分表中。這是一個比較複雜的過程,在遷移過程中需要考慮數據量數據一致性遷移速度等諸多因素。

遷移主要針對 存量數據 和 增量數據 的處理,存量數據指舊數據源中已經存在且有價值的歷史數據,增量數據指當下持續增長以及未來產生的業務數據。

存量數據可以採用定時、分批次的遷移,遷移過程可能會持續幾天。

增量數據可以採用新、舊資料庫集群雙寫模式。待數據遷移完畢,業務驗證了數據一致性,應用直接切換數據源即可。

後續我們會結合三方工具,來演示遷移的過程。

影子庫

什麼是影子庫(Shadow Table)?

影子庫是一個與生產環境資料庫結構完全相同的實例,它存在的意義是為了在不影響線上系統的情況下,驗證資料庫遷移或者其他資料庫變更操作的正確性,以及全鏈路壓測。影子庫中存儲的數據是從生產環境中定期複製過來的,但是它不對線上業務產生任何影響,僅用於測試,驗證和調試。

圖片

在進行資料庫升級、版本變更、參數調優等操作前,通過在影子庫上模擬這些操作,可以發現潛在的問題,因為測試環境的數據是不可靠的。

在使用影子庫時,需要遵循以下幾個原則:

  • 與生產環境資料庫的結構應該完全一致,包括表結構、索引、約束等;

  • 數據要與生產環境保持一致,可以通過定期同步方式實現;

  • 讀寫操作不會影響生產環境,一般情況下應該禁止在影子庫上執行更新、刪除等操作;

  • 由於影子庫的數據特點,訪問許可權應該嚴格控制,只允許授權人員進行訪問和操作;

     

     

    作者|程式員內點事

本文來自博客園,作者:古道輕風,轉載請註明原文鏈接:https://www.cnblogs.com/88223100/p/21-bidding-for-database-and-table-division.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在內核開發中,經常需要進行進程和句柄之間的互相轉換。進程通常由一個唯一的進程標識符(PID)來標識,而句柄是指對內核對象的引用。在Windows內核中,`EProcess`結構表示一個進程,而HANDLE是一個句柄。為了實現進程與句柄之間的轉換,我們需要使用一些內核函數。對於進程PID和句柄的互相轉... ...
  • 環境:CentOS 7.6_x64 Python版本 :3.9.12 pjsip版本:2.13 之前寫過一篇CentOS7環境編譯python3.9版本pjsua的文章: https://www.cnblogs.com/MikeZhang/p/centos7py39pjsua20230608.htm ...
  • 經過前幾篇文章的講解,初步瞭解ASP.NET Core MVC項目創建,啟動運行,以及命名約定,創建控制器,視圖,模型,接收參數,傳遞數據ViewData,ViewBag,路由,頁面佈局,wwwroot和客戶端庫,Razor語法,EnityFrameworkCore與資料庫,HttpContext,... ...
  • # 記錄伺服器和docker時區修改 ## 前言 我的博客是部署在docker裡面的,然後我發現評論和留言的時間和北京時間是有差別的,相差8個小時,然後發現是因為容器中的時區設置與伺服器是不一致的,所以需要設置一下。 ## 更改liunx伺服器時區 1. 查看當前時區設置 使用`date`命令查看當 ...
  • 大家好,我是沙漠盡頭的狼。 Dotnet9網站回歸Blazor重構,訪問速度確實飛快,同時用上Blazor的交互能力,站長也同步添加了幾個線上工具,這篇文章分享下Blazor的重構過程,希望對大家網站開發時做技術選型有個參考。 ![](https://img1.dotnet9.com/2023/06 ...
  • 當我們輸入ls 再按下TAB時, 會自動列出當前路徑下所有的文件; 當我們輸入ls a 再按下TAB時, 會自動列出當前路徑下所有以a開頭的文件; 若只有一個以a開頭的文件, 將會自動補全; 這是怎麼做到的? 本文將帶你一探究竟 ...
  • 端午放假,本想註冊個美團眾包騎自行車送外賣體驗一下生活,奈何這幾天北京熱的要死,只能作罷,還是苟在屋裡空調續命吧。 無事乾的時候,想著給我花盆監控升個級,換個電容的土壤檢測(`之前的腐蝕了gg了`)但是電容的是3v的,esp8266只能檢測1v的,所以買了一個新的esp32-cam,正好帶個攝像頭,... ...
  • # MVCC機制遺留的問題 **為什麼在可重覆讀級別下,幻讀沒有產生?** 回想一下在事務隔離級別那篇文章中,可串列化是通過什麼保證的? 對操作的每一行記錄加讀鎖、寫鎖和範圍鎖;任何其他事務都必須等待持有鎖的事務釋放鎖之後才能進行操作; 而可重覆讀級別相比之下唯一少的就是範圍鎖,所以無論你是否瞭解過 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...