【Java高階面經:數據庫篇】17、分庫分表分頁查詢優化:告別慢查詢與內存爆炸

在這里插入圖片描述

一、分庫分表基礎:策略與中間件形態

1.1 分庫分表核心策略

分庫分表是應對海量數據存儲和高并發訪問的關鍵架構設計,其核心在于將數據分散到不同的數據庫或表中,以突破單庫單表的性能限制。常見的分庫分表策略包括:

1.1.1 哈希分庫分表
  • 原理:通過對分庫分表鍵(如用戶ID、訂單ID)進行哈希計算,通常取余操作(如buyer_id % 8),將數據均勻分布到不同的分片(庫或表)中。
  • 優點:數據分布均勻,適合高并發寫入場景,如電商訂單、用戶系統。
  • 缺點:不支持范圍查詢(如按時間排序),分片數量固定后難以動態擴展。
1.1.2 范圍分庫分表
  • 原理:按數據范圍分段存儲,常見的分段維度包括時間(如按年份、月份分表)、數值區間(如用戶ID>1000000的分至新庫)。
  • 優點:天然支持按范圍查詢,如按時間查詢訂單,適合日志系統、歷史數據歸檔。
  • 缺點:可能導致數據熱點,如最近時間段的分片訪問壓力顯著高于其他分片。
1.1.3 中間表策略
  • 原理:額外維護一張中間表,存儲主鍵與目標表的映射關系。例如,訂單表通過中間表記錄每個訂單ID對應的實際表名或庫名。
  • 優點:解耦業務邏輯與分片規則,便于動態調整分片策略。
  • 缺點:增加一次查詢開銷(先查中間表再查目標表),需考慮緩存策略提升性能。

1.2 分庫分表中間件形態

中間件是實現分庫分表邏輯的核心組件,根據部署形態和語言兼容性,可分為三類:

1.2.1 SDK形態(如ShardingSphere-JDBC)
  • 特點:以Jar包形式集成到應用中,與編程語言強耦合(如Java),性能損耗低(接近原生JDBC)。
  • 優勢:無需獨立部署,可深度定制分片邏輯,適合對性能要求高的業務。
  • 劣勢:多語言支持成本高,業務代碼需集成SDK,升級維護復雜。
1.2.2 Proxy形態(如MyCat、ShardingSphere-Proxy)
  • 特點:獨立部署的中間層服務,應用通過JDBC/HTTP協議連接,兼容多語言。
  • 優勢:應用無感知,透明化分庫分表邏輯,適合異構系統。
  • 劣勢:引入網絡傳輸延遲,性能瓶頸明顯(尤其是復雜查詢),需額外維護Proxy集群。
1.2.3 Sidecar形態(如Linkerd、Envoy)
  • 特點:與應用實例同機部署的代理進程,介于SDK和Proxy之間。
  • 優勢:性能優于Proxy,語言無關性優于SDK。
  • 現狀:理論形態為主,實際應用較少,需結合云原生架構(如Kubernetes)實現服務網格。

二、分頁查詢性能瓶頸:根源與影響

在分庫分表架構下,傳統的單庫分頁查詢(如LIMIT offset, size)性能急劇下降,主要源于以下核心問題:

2.1 跨分片數據合并與全局排序

2.1.1 問題本質

分頁查詢需要從所有相關分片中拉取數據,合并后進行全局排序,導致:

  • 網絡I/O爆炸:假設查詢第100頁(每頁100條),10個分片每個需返回前10000條數據(100頁×100條/頁),總傳輸量達100,000條,數據量隨分片數線性增長。
  • 內存溢出風險:大量數據在應用層內存中排序,可能觸發OOM(Out Of Memory)。
  • CPU密集計算:歸并排序算法復雜度為O(N log N),N為總數據量,計算開銷巨大。
2.1.2 示例場景
-- 單庫分頁(正常)
SELECT * FROM orders ORDER BY create_time LIMIT 100000, 100; -- 掃描100100條,返回100條-- 分庫后(10個分片)
每個分片執行:SELECT * FROM orders ORDER BY create_time LIMIT 100000, 100; -- 每個分片掃描100100條,共掃描1,001,000條,合并后返回100條

2.2 大Offset值的低效處理

2.2.1 單庫性能損耗

單庫中LIMIT offset, size的性能隨offset增大而下降,因為數據庫需跳過offset條數據后再取size條,本質是O(offset + size)的時間復雜度。例如LIMIT 1000000, 10需掃描1000010條數據,僅返回10條。

2.2.2 分庫場景加劇

分庫后每個分片都需執行一次大offset查詢,總掃描量為分片數×(offset + size),資源浪費成倍增加,且無法利用索引優化(除非排序字段為分片鍵)。

2.3 缺乏全局索引支持

2.3.1 非分片鍵排序困境

若排序字段(如create_time)非分片鍵,各分片無法通過本地索引快速定位排序結果,需全表掃描后排序,再合并全局結果。例如按create_time排序的查詢,每個分片需返回所有數據并排序,合并時形成全量數據排序。

2.3.2 索引碎片化問題

分庫分表后,索引僅存在于單個分片內,全局排序需跨分片聚合,無法利用數據庫原生的索引合并能力。

2.4 分布式事務與一致性開銷

若分頁查詢需要強一致性(如實時統計未付款訂單),需通過分布式事務協調各分片數據狀態,引入額外的鎖機制和網絡交互,進一步降低查詢性能。

三、常規優化方案:從基礎到進階

3.1 游標分頁(Cursor-based Pagination)

3.1.1 核心原理

用“游標”(上一頁最后一條記錄的排序字段值)替代offset,通過條件過濾避免掃描無關數據。例如,按自增ID排序時,上一頁最后一條ID為1000,下一頁查詢WHERE id > 1000 LIMIT 100

3.1.2 實現步驟
  1. 首次查詢:各分片按排序字段查詢前page_size條數據,合并后返回結果,并記錄末尾游標(如最大ID、最新時間戳)。
  2. 后續查詢:各分片根據游標條件查詢WHERE {排序字段} > {游標值},確保每次查詢僅獲取后續數據。
3.1.3 代碼示例(訂單按時間分頁)
-- 首次查詢(各分片執行)
SELECT order_id, create_time 
FROM orders 
ORDER BY create_time, order_id 
LIMIT 100;-- 下一頁查詢(游標:create_time='2023-10-01 12:00:00',order_id=1000)
SELECT order_id, create_time 
FROM orders 
WHERE (create_time > '2023-10-01 12:00:00') OR (create_time = '2023-10-01 12:00:00' AND order_id > 1000)
ORDER BY create_time, order_id 
LIMIT 100;
3.1.4 優缺點
  • 優點:查詢復雜度恒定為O(page_size),內存消耗和網絡傳輸量與分片數成正比(N×page_size),避免大offset掃描。
  • 缺點:僅支持順序翻頁,不支持隨機跳頁(如直接訪問第1000頁),依賴排序字段的單調性。

3.2 分片鍵與分頁鍵對齊

3.2.1 設計思想

將分頁排序字段設計為分片鍵或與分片鍵強相關,使分頁查詢僅命中單個或少量分片,避免跨分片數據合并。

3.2.2 典型場景
  • 哈希分庫+分片鍵排序:分片鍵為user_id,按user_id排序的分頁查詢可直接路由到單個分片,性能等同單表查詢。
  • 范圍分庫+時間排序:按月份分表(分片鍵為create_time的月份),按時間排序的查詢僅需訪問當前月份的分片。
3.2.3 實現限制
  • 需提前規劃業務查詢模式,若后期業務需求變更(如新增非分片鍵排序),可能需要重構分片策略。
  • 適用于查詢模式固定的場景,如社交平臺按用戶時間線分頁。

3.3 全局查詢優化:歸并排序與分批處理

3.3.1 歸并排序優化

傳統全局查詢需將所有分片數據拉取到內存后一次性排序,優化方法是逐步讀取有序數據,減少內存占用:

  1. 各分片返回當前頁數據(如LIMIT page_size),并維護游標。
  2. 應用層通過最小堆/最大堆逐個獲取下一條數據,直到湊滿page_size條。
3.3.2 分批處理示例
// 各分片返回有序列表(如按create_time升序)
List<ShardResult> shardResults = queryShards(); 
PriorityQueue<Row> minHeap = new PriorityQueue<>(Comparator.comparing(Row::getCreateTime));// 初始化堆:各分片取第一條數據
for (ShardResult result : shardResults) {if (!result.isEmpty()) {minHeap.offer(result.popFirst());}
}// 逐個取出最小元素,直到獲取pageSize條
List<Row> pageData = new ArrayList<>();
while (pageData.size() < pageSize && !minHeap.isEmpty()) {Row minRow = minHeap.poll();pageData.add(minRow);// 從對應分片取下一條數據ShardResult result = getShardResult(minRow.getShardId());if (!result.isEmpty()) {minHeap.offer(result.popFirst());}
}
3.3.3 效果
  • 內存占用從O(N×page_size)降低至O(N + page_size)(N為分片數),適合中等分片數場景。

四、高階優化方案:精準與擴展

4.1 二次查詢法(精準分頁)

4.1.1 核心邏輯

通過兩次查詢確定精確的分頁結果,避免全量數據拉取:

  1. 首次查詢:各分片按LIMIT x OFFSET y/N(x為每頁大小,y為總偏移量,N為分片數)獲取部分數據,計算各分片的最小值min_id和最大值max_id
  2. 二次查詢:構造全局范圍查詢BETWEEN min_id AND max_id,從各分片獲取該范圍內的數據,合并后排序。
  3. 計算偏移量:根據全局排序結果,確定min_id的實際偏移位置,截取目標頁數據。
4.1.2 示例場景(查詢第10頁,每頁10條,總偏移量90,分片數3)
  1. 首次查詢:各分片執行LIMIT 10 OFFSET 30(90/3=30),獲取各分片的第31-40條數據,得到min_id=1000max_id=2000
  2. 二次查詢:各分片執行WHERE id BETWEEN 1000 AND 2000 ORDER BY id LIMIT 100,合并后排序,找到第90-100條數據。
4.1.3 優缺點
  • 優點:相比傳統全局查詢減少數據傳輸量,精度高,適合對分頁結果要求嚴格的場景(如后臺管理系統)。
  • 缺點:兩次查詢增加延遲,實現復雜度高,需維護分片數據分布的統計信息。

4.2 中間表+異構存儲(全局索引方案)

4.2.1 中間表設計

額外維護一張包含排序字段的中間表,用于快速定位數據:

  • 表結構
    CREATE TABLE order_index (order_id BIGINT PRIMARY KEY,create_time TIMESTAMP,shard_key INT, -- 分片鍵(如user_id)extra_info JSON -- 其他查詢字段
    );
    
  • 數據同步
    • 雙寫模式:業務寫入主表時同步寫入中間表。
    • 異步同步:通過Canal監聽主表binlog,異步更新中間表(推薦,避免阻塞業務)。
4.2.2 結合Elasticsearch

將中間表數據同步到ES,利用其全局索引能力實現高效分頁:

  1. 業務查詢先訪問ES,獲取符合條件的order_id列表(如按create_time排序的前1000個ID)。
  2. 根據order_id回查主表,獲取完整數據。
4.2.3 代碼示例(ES查詢)
// ES查詢排序字段為create_time的第10頁數據
SearchResponse response = client.prepareSearch("order_index").setQuery(QueryBuilders.matchAllQuery()).addSort("create_time", SortOrder.DESC).setFrom(90).setSize(10).get();List<Long> orderIds = response.getHits().getHits().stream().map(hit -> Long.parseLong(hit.getId())).collect(Collectors.toList());// 回查主表
List<Order> orders = orderDao.batchQuery(orderIds);
4.2.4 適用場景
  • 復雜排序(如多字段組合排序)、模糊查詢(如商品名稱搜索)。
  • 對實時性要求不高(允許秒級延遲),需權衡數據一致性與查詢性能。

4.3 分頁結果緩存(熱點數據優化)

4.3.1 緩存策略
  • 緩存對象:前幾頁高頻訪問的數據(如page=1page=2)。
  • 緩存介質:Redis,設置短過期時間(如10秒)應對數據更新。
  • 緩存鍵設計pagination:table:order:page:1:size:100,包含表名、頁碼、每頁大小等參數。
4.3.2 實現流程
def get_order_page(page, size):cache_key = f"pagination:order:{page}:{size}"data = redis.get(cache_key)if data:return json.loads(data)# 數據庫查詢邏輯results = query_database(page, size)redis.setex(cache_key, 60, json.dumps(results))return results
4.3.3 局限性
  • 僅適用于熱點數據,無法解決深度分頁(如page>1000)問題。
  • 數據更新頻繁時緩存命中率低,需結合業務場景設置合理過期時間。

五、業務層優化:限制與適配

5.1 限制深度分頁(產品層面規避)

5.1.1 實現方式
  • 前端限制:隱藏頁碼輸入框,僅允許通過“上一頁/下一頁”按鈕翻頁,限制最大頁數(如最多顯示前100頁)。
  • 后端校驗:接口層對page參數進行校驗,若page×size > max_offset(如10000條),返回錯誤提示或截斷結果。
5.1.2 示例提示
  • “當前僅支持查看前1000條記錄,請縮小查詢范圍。”
  • “為提升性能,最多顯示前100頁數據。”
5.1.3 適用場景
  • 用戶端分頁需求簡單(如移動端列表瀏覽),無需全量數據遍歷。
  • 后臺管理系統中對大數據集的查詢,引導用戶通過篩選條件縮小范圍。

5.2 業務字段替代Offset(語義化分頁)

利用業務邏輯中的天然有序字段(如時間、版本號)替代offset,例如:

  • 按時間分頁:傳遞上一頁最后一條記錄的時間戳,查詢WHERE create_time < '2023-10-01' LIMIT 100
  • 按版本分頁:用于更新記錄查詢,傳遞上一頁最大版本號,查詢WHERE version < 1000 LIMIT 100

5.3 分頁模式適配移動端

移動端常見的“下拉刷新”(加載最新數據)和“上拉加載更多”(加載歷史數據)可分別適配為:

  • 下拉刷新:固定查詢最新的page_size條數據,無需offset,直接按時間倒序LIMIT page_size
  • 上拉加載更多:使用游標分頁,傳遞上一頁最后一條記錄的時間戳或ID,按時間正序查詢后續數據。

六、方案對比與選型指南

6.1 核心指標對比表

方案內存消耗網絡傳輸實現復雜度支持隨機跳頁適用場景
游標分頁中等按有序鍵順序翻頁(如時間線)
分片鍵對齊極低極低分頁字段固定為分片鍵
二次查詢精準深度分頁(如后臺管理)
中間表+ES極高復雜排序與模糊查詢
結果緩存中等部分支持高頻訪問前幾頁
限制深度分頁極低極低簡單用戶端簡單分頁

6.2 選型決策樹

6.2.1 第一步:是否允許順序翻頁?
  • :優先選擇游標分頁,結合業務字段(如時間戳)實現高效查詢。
  • 否(需隨機跳頁):進入下一步。
6.2.2 第二步:分頁字段是否為分片鍵?
  • :分片鍵對齊方案,性能最優,直接路由至單分片。
  • :進入下一步。
6.2.3 第三步:查詢復雜度與實時性要求
  • 簡單排序(如單字段)+ 實時性高:二次查詢法,通過兩次查詢減少數據量。
  • 復雜排序+ 允許秒級延遲:中間表+ES,利用異構存儲分擔壓力。
  • 高頻簡單查詢:結果緩存,降低數據庫負載。
6.2.4 特殊場景處理
  • 超大數據集(百萬級以上分頁):限制深度分頁,結合業務篩選縮小范圍。
  • 多語言異構系統:選擇Proxy形態中間件(如ShardingSphere-Proxy),屏蔽分片細節。

七、實戰案例:從問題到優化的完整路徑

7.1 案例背景:電商訂單分頁查詢

  • 業務需求:用戶端按訂單創建時間分頁,支持下拉刷新(最新訂單)和上拉加載更多(歷史訂單),日均查詢量超千萬次。
  • 架構現狀:訂單表按user_id哈希分庫(10個庫),排序字段為create_time(非分片鍵),原方案使用傳統全局查詢,頻繁出現內存溢出和超時。

7.2 問題分析

  • 性能瓶頸
    • 下拉刷新(查詢最新10條):各庫拉取10條數據,合并排序,性能尚可。
    • 上拉加載至第100頁(每頁10條):各庫需拉取1000條數據(100×10),總傳輸量10,000條,內存排序耗時達500ms以上。
  • 核心矛盾:非分片鍵排序導致跨庫數據合并,深度分頁時資源消耗激增。

7.3 優化方案實施

7.3.1 游標分頁替代Offset
  • 排序字段組合:使用create_time+order_id(主鍵,唯一有序)作為復合排序鍵,確保游標唯一。
  • 首次查詢(下拉刷新)
    -- 各庫執行
    SELECT order_id, create_time 
    FROM orders 
    ORDER BY create_time DESC, order_id DESC 
    LIMIT 10;
    
    • 應用層合并后返回前10條,游標為最后一條的create_timeorder_id(如2023-10-05 15:00:00, 123456)。
7.3.2 上拉加載優化
  • 下一頁查詢
    -- 各庫執行
    SELECT order_id, create_time 
    FROM orders 
    WHERE (create_time < '2023-10-05 15:00:00') OR (create_time = '2023-10-05 15:00:00' AND order_id < 123456)
    ORDER BY create_time DESC, order_id DESC 
    LIMIT 10;
    
  • 性能對比
    • 優化前:每個庫掃描1000條,總掃描10,000條,內存排序耗時500ms。
    • 優化后:每個庫僅掃描10條,總掃描100條,內存排序耗時<10ms。
7.3.3 熱點數據緩存
  • page=1的下拉刷新結果進行Redis緩存,設置過期時間30秒,命中率達85%,進一步降低數據庫壓力。

7.4 擴展方案:應對未來需求

  • 若后續需支持按status(訂單狀態)排序,可引入中間表+ES方案:
    1. 同步訂單數據到ES,建立statuscreate_time的聯合索引。
    2. 查詢時先從ES獲取order_id列表,再回查主庫,避免跨庫排序。

八、常見問題與解決方案

8.1 游標分頁不支持隨機跳頁如何處理?

  • 問題場景:用戶在分頁列表中直接輸入頁碼跳轉到第500頁。
  • 解決方案
    • 結合業務邏輯限制跳頁功能,僅允許前后N頁跳轉(如N=10)。
    • 若必須支持隨機跳頁,采用二次查詢法或中間表方案,犧牲部分性能換取靈活性。

8.2 中間表數據一致性如何保障?

  • 異步同步延遲:使用Canal監聽binlog時,可能存在毫秒級延遲,需根據業務容忍度設置重試機制。
  • 事務性雙寫:通過本地事務+異步消息確保主表與中間表同時成功或回滾,例如:
    @Transactional
    public void createOrder(Order order) {orderDao.insert(order);orderIndexDao.insert(buildIndex(order));messageProducer.send(order.getId()); // 異步通知其他系統
    }
    

8.3 分庫分表中間件如何選擇?

  • 高性能場景:優先選擇SDK形態(如ShardingSphere-JDBC),深度集成業務代碼,減少中間層開銷。
  • 多語言場景:采用Proxy形態(如ShardingSphere-Proxy),統一處理分庫邏輯,兼容Java、Python等多語言應用。
  • 云原生場景:探索Sidecar形態,結合Kubernetes實現服務網格內的透明分庫分表。

分庫分表中間件對比表

中間件形態語言支持性能(QPS)典型場景
ShardingSphere-JDBCSDKJava10,000+高性能Java應用
MyCatProxy多語言5,000+遺留系統兼容
TiDB數據庫透明8,000+海量數據實時查詢

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80886.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80886.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80886.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

貪心算法之跳躍游戲問題

問題背景 本文背景是leetcode的一道經典題目&#xff1a;跳躍游戲&#xff0c;描述如下&#xff1a; 給定一個非負整數數組 nums&#xff0c;初始位于數組的第一個位置&#xff08;下標0&#xff09;。數組中的每個元素表示在該位置可以跳躍的最大長度。判斷是否能夠到達最后…

Label Studio:開源標注神器

目錄 一、Label Studio 是什么&#xff1f; 二、核心功能大揭秘 2.1 多類型數據全兼容 2.2 個性化定制隨心配 2.3 團隊協作超給力 2.4 機器學習巧集成 三、上手實操超簡單 3.1 安裝部署不頭疼 3.1.1 Docker安裝 3.1.2 pip安裝 3.1.3 Anaconda安裝 3.2 快速開啟標注…

創建信任所有證書的HttpClient:Java 實現 HTTPS 接口調用,等效于curl -k

在 Java 生態中&#xff0c;HttpClient 和 Feign 都是調用第三方接口的常用工具&#xff0c;但它們的定位、設計理念和使用場景有顯著差異。以下是詳細對比&#xff1a; DIFF1. 定位與抽象層級 特性HttpClientFeign層級底層 HTTP 客戶端庫&#xff08;處理原始請求/響應&#…

從零基礎到最佳實踐:Vue.js 系列(7/10):《常用內置 API 與插件》

引言 Vue.js 是一款輕量且強大的前端框架&#xff0c;因其易用性和靈活性受到廣泛歡迎。無論是初學者還是資深開發者&#xff0c;都可以通過其內置 API 和插件生態快速構建高效、可維護的 Web 應用。本文將從基礎用法講起&#xff0c;逐步深入到進階技巧&#xff0c;結合大量實…

線性代數:AI大模型的數學基石

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開…

Java-System工具類深度解析

Java-System工具類深度解析 前言一、System 類概述1.1 基本定義與特點1.2 重要成員變量 二、標準輸入輸出功能2.1 標準輸入&#xff08;System.in&#xff09;2.2 標準輸出&#xff08;System.out&#xff09;2.3 標準錯誤輸出&#xff08;System.err&#xff09; 三、系統屬性…

刪除用戶憑證

Git 部分倉庫無法操作&#xff0c;部分倉庫沒問題 問題出現 我用個人電腦修改了項目&#xff0c;提交了git。然后第二天在公司電腦git pull的時候失敗&#xff0c;只有部分倉庫&#xff0c;git colne直接失敗&#xff0c;部分倉庫無問題。 解決方式 刪除git相關憑證&#xff…

19. 結合Selenium和YAML對頁面實例化PO對象改造

19. 結合Selenium和YAML對頁面實例化PO對象改造 一、架構升級核心思路 1.1 改造核心目標 # 原始PO模式&#xff1a;顯式定義元素定位 username (id, ctl00_MainContent_username)# 改造后PO模式&#xff1a;動態屬性訪問 self.username.send_keys(Tester) # 自動觸發元素定…

鴻蒙App開發學習路徑

以下是一份系統的鴻蒙&#xff08;HarmonyOS&#xff09;App開發學習路徑&#xff0c;適合從零開始逐步掌握相關技能&#xff1a; 1. 基礎知識儲備 1.1 理解鴻蒙系統 鴻蒙核心特性&#xff1a;分布式能力、一次開發多端部署、原子化服務、ArkUI框架。與Android/iOS的區別&…

spring boot啟動報錯:2002 - Can‘t connect to server on ‘192.168.10.212‘ (10061)

錯誤代碼 10061 通常表明無法建立到指定服務器的網絡連接。這個錯誤屬于 Windows Sockets 錯誤代碼&#xff0c;具體指的是無法建立網絡連接&#xff0c;通常是因為目標地址不可達。以下是一些解決此問題的步驟&#xff1a; 檢查 IP 地址和端口&#xff1a; 確保你輸入的 IP …

ARMv7的NVIC中斷優先級

1. 優先級模型 數值規則:數值越小,優先級越高(例如優先級0的異常比優先級1的異常更高);若多個異常的優先級相同,則 異常號(Exception Number) 較小的異常優先執行。固定優先級異常(不可配置):異常類型 優先級值 說明 Reset -3 最高優先級(系統復位) NMI -2 不可屏…

gitee錯誤處理總結

背景 如上圖&#xff0c;根據圖片中的 Git 錯誤提示&#xff0c;我們遇到的問題是 ?本地分支落后于遠程分支&#xff0c;導致 git push 被拒絕。 ?問題原因? 遠程倉庫的 master 分支有其他人推送的新提交&#xff0c;而您的本地 master 分支未同步這些更新&#xff08;即本…

阿里云合集(不定期更新)

一、阿里云申請免費域名證書流程&#xff1a;https://blog.csdn.net/humors221/article/details/143266059 二、阿里云發送國內短信怎樣編程&#xff1a;https://blog.csdn.net/humors221/article/details/139544193 三、阿里云ECS服務器磁盤空間不足的幾個文件&#xff1a;h…

leetcode239 滑動窗口最大值deque方式

這段文字描述的是使用單調隊列&#xff08;Monotonic Queue&#xff09; 解決滑動窗口最大值問題的優化算法。我來簡單解釋一下&#xff1a; 核心思路 問題分析&#xff1a;在滑動窗口中&#xff0c;若存在兩個下標 i < j 且 nums[i] ≤ nums[j]&#xff0c;則 nums[i] 永遠…

小白的進階之路系列之三----人工智能從初步到精通pytorch計算機視覺詳解下

我們將繼續計算機視覺內容的講解。 我們已經知道了計算機視覺,用在什么地方,如何用Pytorch來處理數據,設定一些基礎的設置以及模型。下面,我們將要解釋剩下的部分,包括以下內容: 主題內容Model 1 :加入非線性實驗是機器學習的很大一部分,讓我們嘗試通過添加非線性層來…

elementUI 單選框存在多個互斥的選項中選擇的場景

使用 el-radio-group 來使用單選框組&#xff0c;代碼如下&#xff1a; <el-radio-group input"valueChangeHandler" v-model"featureForm.type"><el-radio name"feature" label"feature">業務對象</el-radio><…

Qt項目開發中所遇

講述下面代碼所表示的含義&#xff1a; QWidget widget_19 new QWidget(); QVBoxLayout *touchAreaLayout new QVBoxLayout(widget_19);QWidget *buttonArea new QWidget(widget_19); 1、新建一個名為widget_19的QWidget&#xff0c;將給其應用垂直管路布局。 2、新建一個…

相機標定與圖像處理涉及的核心坐標系

坐標系相互關系 #mermaid-svg-QxaMjIcgWVap0awV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QxaMjIcgWVap0awV .error-icon{fill:#552222;}#mermaid-svg-QxaMjIcgWVap0awV .error-text{fill:#552222;stroke:#552…

CICD編譯時遇到npm error code EINTEGRITY的問題

場景 CICD編譯時拋出npm error code EINTEGRITY的錯誤 npm error code EINTEGRITY npm error sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA integrity checksum failed when using sha512: wanted sha512-PlhdFcillOINfeV…

使用Spring Boot與Spring Security構建安全的RESTful API

使用Spring Boot與Spring Security構建安全的RESTful API 引言 在現代Web應用開發中&#xff0c;安全性是一個不可忽視的重要方面。Spring Boot和Spring Security為開發者提供了一套強大的工具&#xff0c;用于構建安全的RESTful API。本文將詳細介紹如何結合Spring Boot和Sp…