分庫分表之第五篇

来源:https://www.cnblogs.com/haizai/archive/2020/01/01/12128268.html
-Advertisement-
Play Games

分庫分表之第五篇 9.案例 9.1.需求描述 9.2.資料庫設計 9.3.環境說明 9.4.環境準備 9.4.1.mysql主從同步(windows) 9.4.2.初始化資料庫 9.5.實現步驟 9.5.1搭建maven工程 9.5.2 分片配置 9.5.3 添加商品 9.5.4 查詢商品 9.5. ...


分庫分表之第五篇

 

9.案例

9.1.需求描述

電商平臺商品列表展示,每個列表項中除了包含商品基本信息、商品描述信息之外,還包括了商品所屬的店鋪信息,如下 :
在這裡插入圖片描述
本案例實現功能如下:
1、添加商品
2、商品分頁查詢
3、商品統計

9.2.資料庫設計

資料庫設計如下,其中商品與店鋪信息之間進行了垂直分庫,分為了PRODUCT_DB(商品庫)和STORE_DB(店鋪庫);商品信息還進行了垂直分表,分為了商品基本信息(product_info)和商品描述信息(product_descript),地理區域信息(region)作為公共表,冗餘在兩庫中 :
在這裡插入圖片描述
考慮到商品信息的數據增長性,對PRODUCT_DB(商品庫)進行了水平分庫,分片鍵使用店鋪id,分片策略為店鋪 ID%2 + 1,因此商品描述信息對所屬店鋪ID進行了冗餘;
對商品基本信息(product_info)和商品描述信息(product_descript)進行水平分表,分片鍵使用商品id,分片策略為 商品ID%2 + 1,並將為這兩個表設置為綁定表,避免笛卡爾積join;
為避免主鍵衝突,ID生成策略採用雪花演算法來生成全局唯一ID,最終資料庫設計為下圖:
在這裡插入圖片描述
要求使用讀寫分離來提升性能,可用性。

9.3.環境說明

  • 操作系統 :win10
  • 資料庫 :MySQL-5.7.25
  • JDK :64位 jdk1.8.0_201
  • 應用框架 :spring-bbot-2.1.3.RELEASE,MyBatis3.5.0
  • Sharding-JDBC :sharding-jdbc-spring-boot-starter-4.0.0-RC1

9.4.環境準備

9.4.1.mysql主從同步(windows)

參考讀寫分離章節,對以下庫進行主從同步配置 :

 # 設置需要同步的資料庫 
 binlog‐do‐db=store_db 
 binlog‐do‐db=product_db_1 
 binlog‐do‐db=product_db_2

9.4.2.初始化資料庫

創建store_db資料庫,並執行以下腳本創建表 :

DROP TABLE IF EXISTS `region`; CREATE TABLE `region` (
`id` bigint(20) NOT NULL COMMENT 'id',
`region_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地理區域編碼',
`region_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地理區功能變數名稱稱',
`level` tinyint(1) NULL DEFAULT NULL COMMENT '地理區域級別(省、市、縣)',
`parent_region_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上級地理區域編碼',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `region` VALUES (1, '110000', '北京', 0, NULL); INSERT INTO `region` VALUES (2, '410000', '河南省', 0, NULL); INSERT INTO `region` VALUES (3, '110100', '北京市', 1, '110000'); INSERT INTO `region` VALUES (4, '410100', '鄭州市', 1, '410000');
DROP TABLE IF EXISTS `store_info`; CREATE TABLE `store_info` (
`id` bigint(20) NOT NULL COMMENT 'id',
`store_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '店鋪名稱',
`reputation` int(11) NULL DEFAULT NULL COMMENT '信譽等級',
`region_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '店鋪所在地',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `store_info` VALUES (1, 'XX零食店', 4, '110100'); INSERT INTO `store_info` VALUES (2, 'XX飲品店', 3, '410100');

創建product_db_1、product_db_2資料庫,並分別對兩庫執行以下腳本創建表:

DROP TABLE IF EXISTS `product_descript_1`; CREATE TABLE `product_descript_1` (
`id` bigint(20) NOT NULL COMMENT 'id',
`product_info_id` bigint(20) NULL DEFAULT NULL COMMENT '所屬商品id',
`descript` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '商品描述',`store_info_id` bigint(20) NULL DEFAULT NULL COMMENT '所屬店鋪id', PRIMARY KEY (`id`) USING BTREE,
INDEX `FK_Reference_2`(`product_info_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
DROP TABLE IF EXISTS `product_descript_2`; CREATE TABLE `product_descript_2` (
`id` bigint(20) NOT NULL COMMENT 'id',
`product_info_id` bigint(20) NULL DEFAULT NULL COMMENT '所屬商品id',
`descript` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '商品描述', `store_info_id` bigint(20) NULL DEFAULT NULL COMMENT '所屬店鋪id',
PRIMARY KEY (`id`) USING BTREE,
INDEX `FK_Reference_2`(`product_info_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
DROP TABLE IF EXISTS `product_info_1`; CREATE TABLE `product_info_1` (
`product_info_id` bigint(20) NOT NULL COMMENT 'id',
`store_info_id` bigint(20) NULL DEFAULT NULL COMMENT '所屬店鋪id',
`product_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
COMMENT '商品名稱',
`spec` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '規
格',
`region_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT
'產地',
`price` decimal(10, 0) NULL DEFAULT NULL COMMENT '商品價格',
`image_url` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT
'商品圖片',
PRIMARY KEY (`product_info_id`) USING BTREE,
INDEX `FK_Reference_1`(`store_info_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
DROP TABLE IF EXISTS `product_info_2`; CREATE TABLE `product_info_2` (
`product_info_id` bigint(20) NOT NULL COMMENT 'id',
`store_info_id` bigint(20) NULL DEFAULT NULL COMMENT '所屬店鋪id',
`product_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
COMMENT '商品名稱',
`spec` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '規
格',
`region_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT
'產地',
`price` decimal(10, 0) NULL DEFAULT NULL COMMENT '商品價格',
`image_url` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT
'商品圖片',
PRIMARY KEY (`product_info_id`) USING BTREE,
INDEX `FK_Reference_1`(`store_info_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; DROP TABLE IF EXISTS `region`;
CREATE TABLE `region` (
`id` bigint(20) NOT NULL COMMENT 'id', `region_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地理區域編碼',
`region_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地理區功能變數名稱稱',
`level` tinyint(1) NULL DEFAULT NULL COMMENT '地理區域級別(省、市、縣)',
`parent_region_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上級地理區域編碼',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `region` VALUES (1, '110000', '北京', 0, NULL); INSERT INTO `region` VALUES (2, '410000', '河南省', 0, NULL); INSERT INTO `region` VALUES (3, '110100', '北京市', 1, '110000'); INSERT INTO `region` VALUES (4, '410100', '鄭州市', 1, '410000');

9.5.實現步驟

9.5.1搭建maven工程

(1)搭建工程maven工程shopping,並做好Spring boot相關配置。
(2)引入maven依賴

<dependency>
<groupId>org.apache.shardingsphere</groupId> 
<artifactId>sharding‐jdbc‐spring‐boot‐starter</artifactId> 
<version>4.0.0‐RC1</version>
</dependency>

9.5.2 分片配置

既然是分庫分表,那麼就需要定義多個真實數據源,每一個資料庫鏈接信息就是一個數據源定義,如 :

spring.shardingsphere.datasource.m0.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m0.driver‐class‐name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.m0.url = jdbc:mysql://localhost:3306/store_db?useUnicode=true
spring.shardingsphere.datasource.m0.username = root
spring.shardingsphere.datasource.m0.password = root

m0,就是這個真實數據源的名稱,然後需要告訴Sharding-JDBC,咋們有那些真實數據源,如 :

spring.shardingsphere.datasource.names = m0,m1,m2,s0,s1,s2

如果需要配置讀寫分離,還需要告訴Sharding-JDBC,這麼多真實數據源,那麼有幾個是一套讀寫分離?也就是定義主從邏輯數據源 :

spring.shardingsphere.sharding.master‐slave‐rules.ds0.master‐data‐source‐name=m0 
spring.shardingsphere.sharding.master‐slave‐rules.ds0.slave‐data‐source‐names=s0

若我們已經對m0和s0做了mysql主從同步,那我們需要告訴Sharding-JDBC,m0、s0為一組主從同步數據源,其 中m0為主,s0為從,並且定義名稱為ds0,這個ds0就是主從邏輯數據源。
最終配置如下,具體的分庫分表策略參考註釋內容:

# 真實數據源定義 m為主庫 s為從庫 spring.shardingsphere.datasource.names = m0,m1,m2,s0,s1,s2
spring.shardingsphere.datasource.m0.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m0.driver‐class‐name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.m0.url = jdbc:mysql://localhost:3306/store_db?useUnicode=true
spring.shardingsphere.datasource.m0.username = root
spring.shardingsphere.datasource.m0.password = root
spring.shardingsphere.datasource.m1.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver‐class‐name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.m1.url = jdbc:mysql://localhost:3306/product_db_1? useUnicode=true
spring.shardingsphere.datasource.m1.username = root
spring.shardingsphere.datasource.m1.password = root
spring.shardingsphere.datasource.m2.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m2.driver‐class‐name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.m2.url = jdbc:mysql://localhost:3306/product_db_2? useUnicode=true
spring.shardingsphere.datasource.m2.username = root
spring.shardingsphere.datasource.m2.password = root
spring.shardingsphere.datasource.s0.type = com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.s0.driver‐class‐name = com.mysql.jdbc.Driver spring.shardingsphere.datasource.s0.url = jdbc:mysql://localhost:3307/store_db?useUnicode=true spring.shardingsphere.datasource.s0.username = root spring.shardingsphere.datasource.s0.password = root
spring.shardingsphere.datasource.s1.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.s1.driver‐class‐name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.s1.url = jdbc:mysql://localhost:3307/product_db_1? useUnicode=true
spring.shardingsphere.datasource.s1.username = root
spring.shardingsphere.datasource.s1.password = root
spring.shardingsphere.datasource.s2.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.s2.driver‐class‐name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.s2.url = jdbc:mysql://localhost:3307/product_db_2? useUnicode=true
spring.shardingsphere.datasource.s2.username = root
spring.shardingsphere.datasource.s2.password = root
# 主庫從庫邏輯數據源定義 ds0為store_db ds1為product_db_1 ds2為product_db_2
spring.shardingsphere.sharding.master‐slave‐rules.ds0.master‐data‐source‐name=m0 
spring.shardingsphere.sharding.master‐slave‐rules.ds0.slave‐data‐source‐names=s0
spring.shardingsphere.sharding.master‐slave‐rules.ds1.master‐data‐source‐name=m1 spring.shardingsphere.sharding.master‐slave‐rules.ds1.slave‐data‐source‐names=s1
spring.shardingsphere.sharding.master‐slave‐rules.ds2.master‐data‐source‐name=m2 spring.shardingsphere.sharding.master‐slave‐rules.ds2.slave‐data‐source‐names=s2
# 預設分庫策略,以store_info_id為分片鍵,分片策略為store_info_id % 2 + 1,也就是store_info_id為雙數的 數據進入ds1,為單數的進入ds2
spring.shardingsphere.sharding.default‐database‐strategy.inline.sharding‐column = store_info_id spring.shardingsphere.sharding.default‐database‐strategy.inline.algorithm‐expression = ds$‐> {store_info_id % 2 + 1}
# store_info分表策略,固定分配至ds0的store_info真實表
spring.shardingsphere.sharding.tables.store_info.actual‐data‐nodes = ds$‐>{0}.store_info
spring.shardingsphere.sharding.tables.store_info.table‐strategy.inline.sharding‐column = id
spring.shardingsphere.sharding.tables.store_info.table‐strategy.inline.algorithm‐expression = store_info
# product_info分表策略,分佈在ds1,ds2的product_info_1 product_info_2表 ,分片策略為product_info_id % 2 + 1,product_info_id生成為雪花演算法,為雙數的數據進入product_info_1表,為單數的進入product_info_2 表
spring.shardingsphere.sharding.tables.product_info.actual‐data‐nodes = ds$‐> {1..2}.product_info_$‐>{1..2}
spring.shardingsphere.sharding.tables.product_info.table‐strategy.inline.sharding‐column = product_info_id
spring.shardingsphere.sharding.tables.product_info.table‐strategy.inline.algorithm‐expression = product_info_$‐>{product_info_id % 2 + 1} 
spring.shardingsphere.sharding.tables.product_info.key‐generator.column=product_info_id
spring.shardingsphere.sharding.tables.product_info.key‐generator.type=SNOWFLAKE
# product_descript分表策略,分佈在ds1,ds2的product_descript_1 product_descript_2表 ,分片策略為 product_info_id % 2 + 1,id生成為雪花演算法,product_info_id為雙數的數據進入product_descript_1表,為單 數的進入product_descript_2
spring.shardingsphere.sharding.tables.product_descript.actual‐data‐nodes = ds$‐> {1..2}.product_descript_$‐>{1..2}
spring.shardingsphere.sharding.tables.product_descript.table‐strategy.inline.sharding‐column = product_info_id
spring.shardingsphere.sharding.tables.product_descript.table‐strategy.inline.algorithm‐ expression = product_descript_$‐>{product_info_id % 2 + 1} 
spring.shardingsphere.sharding.tables.product_descript.key‐generator.column=id
spring.shardingsphere.sharding.tables.product_descript.key‐generator.type=SNOWFLAKE
# 設置product_info,product_descript為綁定表
spring.shardingsphere.sharding.binding‐tables[0] = product_info,product_descript
# 設置region為廣播表(公共表),每次更新操作會發送至所有數據源 
spring.shardingsphere.sharding.broadcast‐tables=region
# 打開sql輸出日誌 spring.shardingsphere.props.sql.show = true

9.5.3 添加商品

實體類 :
在這裡插入圖片描述
DAO實現

@Mapper
   @Component
   public interface ProductDao {
//添加商品基本信息
@Insert("insert into product_info(store_info_id,product_name,spec,region_code,price)
value(#{storeInfoId},#{productName},#{spec},#{regionCode},#{price})") @Options(useGeneratedKeys = true,keyProperty = "productInfoId",keyColumn = "id") 
int insertProductInfo(ProductInfo productInfo);
//添加商品描述信息
@Insert("insert into product_descript(product_info_id,descript,store_info_id) value(#
{productInfoId},#{descript},#{storeInfoId})")
@Options(useGeneratedKeys = true,keyProperty = "id",keyColumn = "id") 
int insertProductDescript(ProductDescript productDescript);
}

service實現,針對垂直分庫的兩個庫,分別實現店鋪服務、商品服務

@Service
   public class ProductServiceImpl implements ProductService {
       @Autowired
       private ProductDao productDao;
       @Override
       @Transactional
       public void createProduct(ProductInfo product) {
ProductDescript productDescript = new ProductDescript(); productDescript.setDescript(product.getDescript()); productDao.insertProductInfo(product);//新增商品基本信息 productDescript.setProductInfoId(product.getProductInfoId());
productDescript.setStoreInfoId(product.getStoreInfoId()); //冗餘店鋪信息
productDao.insertProductDescript(productDescript);//新增商品描述信息 
}
}

controller實現:

/**
* 賣家商品展示 */
   @RestController
   public class SellerController {
       @Autowired
       private ProductService productService;
		@PostMapping("/products")
		public String createProject(@RequestBody ProductInfo productInfo) {
		productService.createProduct(productInfo);
		return "創建成功!"; 
	}

單元測試:

@RunWith(SpringRunner.class)
@Spri

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

-Advertisement-
Play Games
更多相關文章
  • 1設定環境如下: Primary資料庫 IP 172.17.22.16 SID orcl Standby資料庫 IP 172.17.22.17 SID orcl 設置提示,以區分操作的位置 primary資料庫 set SQLPROMPT Primary> standby資料庫 set SQLPRO ...
  • 1. 安裝的時候有一個.net警告,這裡給後邊造成了一個隱患,實際上是wondows少了一個framework .net的插件,跟SQLserver安裝本身沒關係,一開始忽略了,後邊就報錯了。 2.點擊下一步 3.上邊的隱患報錯了,“需要microsoft .net framework 3.5 se ...
  • 百度雲網址鏈接: https://pan.baidu.com/s/1BwgdnESI8Fqlos9EIOLv1A 提取碼: wsy5 1.解壓ISO鏡像文件,點擊setup安裝程式 2.進入安裝界面 3.點擊全新SQL server獨立安裝或現有安裝添加功能 4.輸入產品密鑰,網上也有很多,預設下一 ...
  • 一、前期準備(windows7+mysql-8.0.18-winx64) 1.下載地址:https://dev.mysql.com/downloads/ 2.選擇直接下載不登錄賬號,下載的壓縮包大概兩百多M,解壓後一個G左右 3.壓縮文件,記著壓縮文件的位置,下邊需要添加環境變數,我的: C:\Pr ...
  • 過程和Duplicate複製資料庫並創建物理StandBy類似,只是不需要重啟資料庫。 目的:創建standby,不重啟源資料庫 1設定環境如下: Primary資料庫 IP 172.17.22.16 SID orcl Standby資料庫 IP 172.17.22.17 SID orcl_stan ...
  • 本文環境:centos 7,Python3編譯安裝成功,包括pip3,然後需要安裝redis相關的Python3驅動包,本的redis指redis包而非redis資料庫,rediscluster類似。 先理清楚幾個概念1,redis包更準確地說是redis-py包,是Python連接Redis的驅動 ...
  • 開始接觸php編程,最初級的選擇了wampserver+phpstorm+notepad++。值得註意的有一下幾點。 1.使用跳過不輸入資料庫密碼登錄資料庫之後請及時修改資料庫密碼以及相關文件。否則在後續的某個時間點的編程中無法連接資料庫。 感悟部分 ...
  • 1、檢查安裝包 安裝依賴包 yum -y install gcc make binutils gcc-c++ compat-libstdc++-33 elfutils-libelf-devel elfutils-libelf-devel-static elfutils-libelf-devel ks ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...