如何使用JMeter 進行全鏈路壓測

使用 JMeter 進行全鏈路壓測:詳細步驟指南

全鏈路壓測旨在測試整個系統的性能,包括所有的組件和服務。通過 Apache JMeter 進行全鏈路壓測,可以模擬真實用戶行為,測試系統在高負載下的表現。以下是詳細的步驟指南,分為準備階段、測試設計、執行和結果分析四個主要部分。

1. 準備階段

1.1 定義測試目標

在進行全鏈路壓測之前,首先要明確測試的目標:

  • 響應時間:確定系統在不同負載下的響應時間。
  • 吞吐量:衡量系統在單位時間內處理的請求數。
  • 穩定性:驗證系統在持續高負載下的穩定性。
  • 瓶頸識別:找出系統性能的瓶頸點。
1.2 環境準備

全鏈路壓測需要在一個盡量接近生產環境的測試環境中進行。準備工作包括:

  • 硬件準備:配置與生產環境相似的硬件,包括服務器、數據庫和網絡設備。
  • 軟件配置:安裝與生產環境相同的操作系統、中間件、數據庫和應用程序版本。
  • 網絡條件:配置與生產環境相似的網絡條件,包括帶寬和延遲。
  • 數據準備:準備測試數據,確保數據量和數據分布與生產環境相似。
1.3 工具安裝

安裝和配置 JMeter 及其所需的插件和依賴:

  • Apache JMeter:主要的性能測試工具。
  • JMeter Plugins:如 JMeter Plugins Manager,用于擴展 JMeter 的功能。
  • InfluxDB:用于存儲測試結果數據。
  • Grafana:用于可視化展示測試結果。

2. 測試設計

2.1 識別關鍵業務流程

識別系統中的關鍵業務流程,這些流程是用戶使用系統時的主要操作路徑。例如,在一個電商網站中,關鍵業務流程可能包括:

  • 用戶登錄
  • 瀏覽商品
  • 添加商品到購物車
  • 提交訂單
  • 支付訂單
2.2 創建 JMeter 測試計劃

在 JMeter 中創建測試計劃,涵蓋上述關鍵業務流程。以下是一個示例結構:

  • Test Plan
    • Thread Group(用戶組)
      • HTTP Request Defaults(默認請求設置)
      • Login(登錄)
        • HTTP Request
        • JSON Extractor(提取登錄響應中的用戶信息)
      • Browse Products(瀏覽商品)
        • HTTP Request
      • Add to Cart(添加到購物車)
        • HTTP Request
      • Checkout(結賬)
        • HTTP Request
      • Payment(支付)
        • HTTP Request
      • View Results Tree(結果樹)
      • Summary Report(匯總報告)
2.3 配置測試參數

為每個 HTTP 請求配置參數,如 URL、請求方法、請求頭、請求體等。使用 CSV Data Set Config 從 CSV 文件中讀取用戶數據,模擬多用戶登錄和操作。

2.4 設置斷言

為關鍵請求添加斷言,驗證響應數據是否正確。例如,登錄請求可以添加響應碼斷言,驗證是否返回200狀態碼。

2.5 配置負載參數

在 Thread Group 中設置負載參數,包括線程數(虛擬用戶數)、Ramp-Up Period(線程啟動時間)、Loop Count(循環次數)等。根據測試目標和環境配置合適的負載。

3. 測試執行

3.1 驗證測試腳本

在正式執行測試前,先用少量線程數驗證測試腳本是否正確,確保所有請求和參數配置正確。

3.2 執行壓力測試

逐步增加線程數,執行壓力測試,觀察系統在不同負載下的表現。記錄系統的響應時間、吞吐量、錯誤率等性能指標。

3.3 收集監控數據

使用監控工具(如 Prometheus 和 Grafana)監控系統的資源使用情況,包括 CPU、內存、磁盤和網絡等。確保在測試過程中系統的資源使用情況在預期范圍內。

3.4 保存測試結果

將 JMeter 的測試結果保存到文件中,以便后續分析。可以使用 Listener 將結果保存為 CSV 或者 JTL 格式。

4. 結果分析

4.1 分析測試結果

使用 JMeter 內置的 Listener 分析測試結果,包括響應時間分布、吞吐量、錯誤率等。識別系統的瓶頸和性能問題。

4.2 可視化測試結果

使用 Grafana 將測試結果可視化,生成響應時間、吞吐量和資源使用情況的圖表,方便直觀地分析系統性能。

4.3 優化系統性能

根據測試結果,識別并優化系統的瓶頸。例如,優化數據庫查詢、增加緩存、調整線程池配置等。

4.4 重新測試

在優化系統后,重新執行全鏈路壓測,驗證優化措施的效果。確保系統性能得到提升,并在高負載下表現穩定。

詳細步驟示例

以下是一個詳細的示例,展示如何通過 JMeter 進行全鏈路壓測。

1. 創建測試計劃

打開 JMeter,新建一個測試計劃(Test Plan)。

2. 添加線程組

在測試計劃中添加一個線程組(Thread Group),設置線程數、Ramp-Up Period 和循環次數。

Test Plan- Thread Group- Number of Threads (users): 100- Ramp-Up Period (seconds): 10- Loop Count: 10
3. 配置 HTTP 請求

在線程組中添加 HTTP 請求(HTTP Request),配置請求的 URL、方法、參數等。

Thread Group- HTTP Request- Name: Login- URL: http://example.com/login- Method: POST- Parameters:- username: ${username}- password: ${password}
4. 添加 JSON 提取器

在登錄請求下添加 JSON 提取器(JSON Extractor),提取響應中的用戶信息。

HTTP Request (Login)- JSON Extractor- Reference Name: user_id- JSON Path: $.user.id
5. 添加瀏覽商品請求

在線程組中添加瀏覽商品請求,配置請求的 URL 和方法。

Thread Group- HTTP Request (Browse Products)- URL: http://example.com/products- Method: GET
6. 添加添加到購物車請求

在線程組中添加添加到購物車請求,配置請求的 URL、方法和參數。

Thread Group- HTTP Request (Add to Cart)- URL: http://example.com/cart/add- Method: POST- Parameters:- product_id: ${product_id}- user_id: ${user_id}
7. 添加結賬請求

在線程組中添加結賬請求,配置請求的 URL 和方法。

Thread Group- HTTP Request (Checkout)- URL: http://example.com/checkout- Method: POST- Parameters:- cart_id: ${cart_id}- user_id: ${user_id}
8. 添加支付請求

在線程組中添加支付請求,配置請求的 URL 和方法。

Thread Group- HTTP Request (Payment)- URL: http://example.com/payment- Method: POST- Parameters:- order_id: ${order_id}- user_id: ${user_id}
9. 添加結果監聽器

在線程組中添加結果監聽器(Listener),如結果樹(View Results Tree)和匯總報告(Summary Report)。

Thread Group- View Results Tree- Summary Report
10. 配置 CSV Data Set Config

在測試計劃中添加 CSV Data Set Config,從 CSV 文件中讀取測試數據。

Test Plan- CSV Data Set Config- Filename: user_data.csv- Variable Names: username, password, product_id, cart_id, order_id

測試執行

1. 驗證測試腳本

先用少量線程數驗證測試腳本是否正確,確保所有請求和參數配置正確。

2. 執行壓力測試

逐步增加線程數,執行壓力測試,觀察系統在不同負載下的表現。記錄系統的響應時間、吞吐量、錯誤率等性能指標。

3. 收集監控數據

使用監控工具(如 Prometheus 和 Grafana)監控系統的資源使用情況,包括 CPU、內存、磁盤和網絡等。

4. 保存測試結果

將 JMeter 的測試結果保存到文件中,以便后續分析。可以使用 Listener 將結果保存為 CSV 或者 JTL 格式。

結果分析

1. 分析測試結果

使用 JMeter 內

置的 Listener 分析測試結果,包括響應時間分布、吞吐量、錯誤率等。識別系統的瓶頸和性能問題。

2. 可視化測試結果

使用 Grafana 將測試結果可視化,生成響應時間、吞吐量和資源使用情況的圖表,方便直觀地分析系統性能。

3. 優化系統性能

根據測試結果,識別并優化系統的瓶頸。例如,優化數據庫查詢、增加緩存、調整線程池配置等。

4. 重新測試

在優化系統后,重新執行全鏈路壓測,驗證優化措施的效果。確保系統性能得到提升,并在高負載下表現穩定。

詳細代碼示例

以下是一個完整的 JMeter 測試計劃 XML 配置示例:

<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.4.1"><hashTree><TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true"><stringProp name="TestPlan.comments"></stringProp><boolProp name="TestPlan.functional_mode">false</boolProp><boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp><boolProp name="TestPlan.serialize_threadgroups">false</boolProp><elementProp name="TestPlan.user_defined_variables" elementType="Arguments"><collectionProp name="Arguments.arguments"/></elementProp><stringProp name="TestPlan.user_define_classpath"></stringProp></TestPlan><hashTree><CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="CSV Data Set Config" enabled="true"><stringProp name="filename">user_data.csv</stringProp><stringProp name="fileEncoding"></stringProp><stringProp name="variableNames">username,password,product_id,cart_id,order_id</stringProp><stringProp name="delimiter">,</stringProp><boolProp name="quotedData">false</boolProp><boolProp name="recycle">true</boolProp><boolProp name="stopThread">false</boolProp><stringProp name="shareMode">shareMode.all</stringProp></CSVDataSet><hashTree/><ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true"><stringProp name="ThreadGroup.on_sample_error">continue</stringProp><elementProp name="ThreadGroup.main_controller" elementType="LoopController"><boolProp name="LoopController.continue_forever">false</boolProp><stringProp name="LoopController.loops">10</stringProp></elementProp><stringProp name="ThreadGroup.num_threads">100</stringProp><stringProp name="ThreadGroup.ramp_time">10</stringProp><boolProp name="ThreadGroup.scheduler">false</boolProp><stringProp name="ThreadGroup.duration"></stringProp><stringProp name="ThreadGroup.delay"></stringProp></ThreadGroup><hashTree><ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults" enabled="true"><elementProp name="HTTPsampler.Arguments" elementType="Arguments"><collectionProp name="Arguments.arguments"/></elementProp><stringProp name="HTTPSampler.domain">example.com</stringProp><stringProp name="HTTPSampler.port"></stringProp><stringProp name="HTTPSampler.protocol">http</stringProp><stringProp name="HTTPSampler.contentEncoding"></stringProp><stringProp name="HTTPSampler.path"></stringProp><stringProp name="HTTPSampler.concurrentPool">6</stringProp><stringProp name="HTTPSampler.connect_timeout"></stringProp><stringProp name="HTTPSampler.response_timeout"></stringProp></ConfigTestElement><hashTree/><HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Login" enabled="true"><elementProp name="HTTPsampler.Arguments" elementType="Arguments"><collectionProp name="Arguments.arguments"><elementProp name="username" elementType="HTTPArgument"><boolProp name="HTTPArgument.always_encode">false</boolProp><stringProp name="Argument.value">${username}</stringProp><stringProp name="Argument.metadata">=</stringProp><boolProp name="HTTPArgument.use_equals">true</boolProp><stringProp name="Argument.name">username</stringProp></elementProp><elementProp name="password" elementType="HTTPArgument"><boolProp name="HTTPArgument.always_encode">false</boolProp><stringProp name="Argument.value">${password}</stringProp><stringProp name="Argument.metadata">=</stringProp><boolProp name="HTTPArgument.use_equals">true</boolProp><stringProp name="Argument.name">password</stringProp></elementProp></collectionProp></elementProp><stringProp name="HTTPSampler.domain">example.com</stringProp><stringProp name="HTTPSampler.port"></stringProp><stringProp name="HTTPSampler.protocol">http</stringProp><stringProp name="HTTPSampler.path">/login</stringProp><stringProp name="HTTPSampler.method">POST</stringProp><boolProp name="HTTPSampler.follow_redirects">true</boolProp><boolProp name="HTTPSampler.auto_redirects">false</boolProp><boolProp name="HTTPSampler.use_keepalive">true</boolProp><boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp><stringProp name="HTTPSampler.monitor">false</stringProp><stringProp name="HTTPSampler.embedded_url_re"></stringProp><stringProp name="HTTPSampler.connect_timeout"></stringProp><stringProp name="HTTPSampler.response_timeout"></stringProp></HTTPSamplerProxy><hashTree><JSONPostProcessor guiclass="JSONPostProcessorGui" testclass="JSONPostProcessor" testname="JSON Extractor" enabled="true"><stringProp name="JSONPostProcessor.referenceNames">user_id</stringProp><stringProp name="JSONPostProcessor.jsonPathExprs">$.user.id</stringProp><stringProp name="JSONPostProcessor.match_numbers">0</stringProp><stringProp name="JSONPostProcessor.defaultValues"></stringProp></JSONPostProcessor></hashTree><HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Browse Products" enabled="true"><elementProp name="HTTPsampler.Arguments" elementType="Arguments"><collectionProp name="Arguments.arguments"/></elementProp><stringProp name="HTTPSampler.domain">example.com</stringProp><stringProp name="HTTPSampler.port"></stringProp><stringProp name="HTTPSampler.protocol">http</stringProp><stringProp name="HTTPSampler.path">/products</stringProp><stringProp name="HTTPSampler.method">GET</stringProp><boolProp name="HTTPSampler.follow_redirects">true</boolProp><boolProp name="HTTPSampler.auto_redirects">false</boolProp><boolProp name="HTTPSampler.use_keepalive">true</boolProp><boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp><stringProp name="HTTPSampler.monitor">false</stringProp><stringProp name="HTTPSampler.embedded_url_re"></stringProp><stringProp name="HTTPSampler.connect_timeout"></stringProp><stringProp name="HTTPSampler.response_timeout"></stringProp></HTTPSamplerProxy><hashTree/><HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Add to Cart" enabled="true"><elementProp name="HTTPsampler.Arguments" elementType="Arguments"><collectionProp name="Arguments.arguments"><elementProp name="product_id" elementType="HTTPArgument"><boolProp name="HTTPArgument.always_encode">false</boolProp><stringProp name="Argument.value">${product_id}</stringProp><stringProp name="Argument.metadata">=</stringProp><boolProp name="HTTPArgument.use_equals">true</boolProp><stringProp name="Argument.name">product_id</stringProp></elementProp><elementProp name="user_id" elementType="HTTPArgument"><boolProp name="HTTPArgument.always_encode">false</boolProp><stringProp name="Argument.value">${user_id}</stringProp><stringProp name="Argument.metadata">=</stringProp><boolProp name="HTTPArgument.use_equals">true</boolProp><stringProp name="Argument.name">user_id</stringProp></elementProp></collectionProp></elementProp><stringProp name="HTTPSampler.domain">example.com</stringProp><stringProp name="HTTPSampler.port"></stringProp><stringProp name="HTTPSampler.protocol">http</stringProp><stringProp name="HTTPSampler.path">/cart/add</stringProp><stringProp name="HTTPSampler.method">POST</stringProp><boolProp name="HTTPSampler.follow_redirects">true</boolProp><boolProp name="HTTPSampler.auto_redirects">false</boolProp><boolProp name="HTTPSampler.use_keepalive">true</boolProp><boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp><stringProp name="HTTPSampler.monitor">false</stringProp><stringProp name="HTTPSampler.embedded_url_re"></stringProp><stringProp name="HTTPSampler.connect_timeout"></stringProp><stringProp name="HTTPSampler.response_timeout"></stringProp></HTTPSamplerProxy><hashTree/><HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout" enabled="true"><elementProp name="HTTPsampler.Arguments" elementType="Arguments"><collectionProp name="Arguments.arguments"><elementProp name="cart_id" elementType="HTTPArgument"><boolProp name="HTTPArgument.always_encode">false</boolProp><stringProp name="Argument.value">${cart_id}</stringProp><stringProp name="Argument.metadata">=</stringProp><boolProp name="HTTPArgument.use_equals">true</boolProp><stringProp name="Argument.name">cart_id</stringProp></elementProp><elementProp name="user_id" elementType="HTTPArgument"><boolProp name="HTTPArgument.always_encode">false</boolProp><stringProp name="Argument.value">${user_id}</stringProp><stringProp name="Argument.metadata">=</stringProp><boolProp name="HTTPArgument.use_equals">true</boolProp><stringProp name="Argument.name">user_id</stringProp></elementProp></collectionProp></elementProp><stringProp name="HTTPSampler.domain">example.com</stringProp><stringProp name="HTTPSampler.port"></stringProp><stringProp name="HTTPSampler.protocol">http</stringProp><stringProp name="HTTPSampler.path">/checkout</stringProp><stringProp name="HTTPSampler.method">POST</stringProp><boolProp name="HTTPSampler.follow_redirects">true</boolProp><boolProp name="HTTPSampler.auto_redirects">false</boolProp><boolProp name="HTTPSampler.use_keepalive">true</boolProp><boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp><stringProp name="HTTPSampler.monitor">false</stringProp><stringProp name="HTTPSampler.embedded_url_re"></stringProp><stringProp name="HTTPSampler.connect_timeout"></stringProp><stringProp name="HTTPSampler.response_timeout"></stringProp></HTTPSamplerProxy><hashTree/><HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Payment" enabled="true"><elementProp name="HTTPsampler.Arguments" elementType="Arguments"><collectionProp name="Arguments.arguments"><elementProp name="order_id" elementType="HTTPArgument"><boolProp name="HTTPArgument.always_encode">false</boolProp><stringProp name="Argument.value">${order_id}</stringProp><stringProp name="Argument.metadata">=</stringProp><boolProp name="HTTPArgument.use_equals">true</boolProp><stringProp name="Argument.name">order_id</stringProp></elementProp><elementProp name="user_id" elementType="HTTPArgument"><boolProp name="HTTPArgument.always_encode">false</boolProp><stringProp name="Argument.value">${user_id}</stringProp><stringProp name="Argument.metadata">=</stringProp><boolProp name="HTTPArgument.use_equals">true</boolProp><stringProp name="Argument.name">user_id</stringProp></elementProp></collectionProp></elementProp><stringProp name="HTTPSampler.domain">example.com</stringProp><stringProp name="HTTPSampler.port"></stringProp><stringProp name="HTTPSampler.protocol">http</stringProp><stringProp name="HTTPSampler.path">/payment</stringProp><stringProp name="HTTPSampler.method">POST</stringProp><boolProp name="HTTPSampler.follow_redirects">true</boolProp><boolProp name="HTTPSampler.auto_redirects">false</boolProp><boolProp name="HTTPSampler.use_keepalive">true</boolProp><boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp><stringProp name="HTTPSampler.monitor">false</stringProp><stringProp name="HTTPSampler.embedded_url_re"></stringProp><stringProp name="HTTPSampler.connect_timeout"></stringProp><stringProp name="HTTPSampler.response_timeout"></stringProp></HTTPSamplerProxy><hashTree/><ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true"><boolProp name="ResultCollector.error_logging">false</boolProp><objProp><name>saveConfig</name><value class="SampleSaveConfiguration"><time>true</time><latency>true</latency><timestamp>true</timestamp><success>true</success><label>true</label><code>true</code><message>true</message><threadName>true</threadName><dataType>true</dataType><encoding>false</encoding><assertions>true</assertions><subresults>true</subresults><responseData>false</responseData><samplerData>false</samplerData><xml>true</xml><fieldNames>true</fieldNames><responseHeaders>false</responseHeaders><requestHeaders>false</requestHeaders><responseDataOnError>false</responseDataOnError><saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage><assertionsResultsToSave>0</assertionsResultsToSave><bytes>true</bytes><sentBytes>true</sentBytes><url>true</url><threadCounts>true</threadCounts><idleTime>true</idleTime><connectTime>true</connectTime></value></objProp><stringProp name="filename"></stringProp></ResultCollector><hashTree/><ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="Summary Report" enabled="true"><boolProp name="ResultCollector.error_logging">false</boolProp><objProp><name>saveConfig</name><value class="SampleSaveConfiguration"><time>true</time><latency>true</latency><timestamp>true</timestamp><success>true</success><label>true</label><code>true</code><message>true</message><threadName>true</threadName><dataType>true</dataType><encoding>false</encoding><assertions>true</assertions><subresults>true</subresults><responseData>false</responseData><samplerData>false</samplerData><xml>true</xml><fieldNames>true</fieldNames><responseHeaders>false</responseHeaders><requestHeaders>false</requestHeaders><responseDataOnError>false</responseDataOnError><saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage><assertionsResultsToSave>0</assertionsResultsToSave><bytes>true</bytes><sentBytes>true</sentBytes><url>true</url><threadCounts>true</threadCounts><idleTime>true</idleTime><connectTime>true</connectTime></value></objProp><stringProp name="filename"></stringProp></ResultCollector><hashTree/></hashTree></hashTree></hashTree>
</jmeterTestPlan>

總結

通過以上步驟,你可以使用 JMeter 進行全鏈路壓測,覆蓋從用戶登錄到支付的完整業務流程。通過配置合理的負載參數、添加必要的監控和結果分析工具,你可以全面了解系統在高負載下的表現,并找到系統的性能瓶頸,進行針對性的優化。全鏈路壓測不僅能幫助你提升系統的穩定性和可靠性,還能為未來的擴展和優化提供寶貴的數據支持。

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

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

相關文章

AWTK實現汽車儀表Cluster/DashBoard嵌入式GUI開發(七):快啟

前言: 汽車儀表是人們了解汽車狀況的窗口,而儀表中的大部分信息都是以指示燈形式顯示給駕駛者。儀表指示燈圖案都較為抽象,對駕駛不熟悉的人在理解儀表指示燈含義方面存在不同程度的困難,尤其對于駕駛新手,如果對指示燈的含義不求甚解,有可能影響駕駛的安全性。即使是對…

Pytest框架實戰二

在Pytest框架實戰一中詳細地介紹了Pytest測試框架在參數化以及Fixture函數在API測試領域的實戰案例以及具體的應用。本文章接著上個文章的內容繼續闡述Pytest測試框架優秀的特性以及在自動化測試領域的實戰。 conftest.py 在上一篇文章中闡述到Fixture函數的特性&#xff0c;第…

shell循環

一、for循環 用法&#xff1a; for 變量 in 取值列表 do 命令序列 done 例1&#xff1a;打印1到10的數字列表 #!/bin/bashfor i in {1..10} do echo $i done 例2&#xff1a;#批量添加用戶,用戶名存放在users.txt文件中&#xff0c;每行一個,初始密碼均設為123456 #!/bin/bas…

KMP算法【C++】

KMP算法測試 KMP 算法詳解 根據解釋寫出對應的C代碼進行測試&#xff0c;也可以再整理成一個函數 #include <iostream> #include <vector>class KMP { private:std::string m_pat;//被匹配的字符串std::vector<std::vector<int>> m_dp;//狀態二維數組…

怎樣解決Redis高并發競爭Key難點?

Redis作為一種高性能的鍵值存儲系統&#xff0c;在現代分布式系統中發揮著重要作用。然而&#xff0c;高并發場景下對同一Key的操作可能引發競爭條件&#xff0c;給系統穩定性和數據一致性帶來挑戰。本文將探討如何解決這一問題&#xff0c;為讀者提供有效的應對策略。 1. Red…

【002】FlexBison實現原理

0. 前言 Flex和Bison是用于構建處理結構化輸入的程序的工具。它們最初是用于構建編譯器的工具&#xff0c;但它們已被證明在許多其他領域都很有用。 &#xfeff; 在第一章中&#xff0c;我們將首先看一點(但不是太多)它們背后的理論&#xff0c;然后我們將深入研究一些使用它…

Mysql和Postgresql創建用戶和授權命令

Mysql和Postgresql創建用戶和授權命令 MySQL/MariaDB/TiDB mysql -uroot -P3306 -p 輸入密碼&#xff1a;xxx create user user1% identified by xxx; grant all privileges on *.* to user1%; create user user2% identified by xxx; grant all privileges on *.* to user2%;…

Winform /C# 截圖當前窗體,指定區域,當前屏幕

1.當前窗體 public static Image CaptureControl(Control ctrl){System.Drawing.Bitmap bmp new System.Drawing.Bitmap(ctrl.Width, ctrl.Height);ctrl.DrawToBitmap(bmp, new Rectangle(0, 0, ctrl.Width, ctrl.Height));return bmp;}private void DownLoad(){string filePa…

java類中運行main方法時報錯:找不到或無法加載主類 XXX

運行main類報了這個錯 錯誤: 找不到或無法加載主類 XXX 經過好一番查證才找出了問題所在 原因是 maven項目的provided導致的&#xff0c;現在記錄一下。 將pom.xml中標注provided的注釋掉&#xff0c;就不報錯了。

ERROR [internal] load metadata for docker.io/library/node:20-alpine

docker編譯時報錯&#xff0c;除標題外&#xff0c;還報如下信息 ERROR: failed to solve: node:20-alpine: failed to resolve source metadata for docker.io/library/node:20-alpine: failed to do request: Head "https://registry-1.docker.io/v2/library/node/mani…

常用個人信息

目錄 常用聯系方式我的自動思維常用媒體專業相關康米相關黑歷史 常用聯系方式 QQ&#xff1a;2868679921 微信&#xff1a;Commieee 郵箱&#xff1a;sharvefoxmail.com 我的自動思維 常用媒體 嗶哩嗶哩 專業相關 博客 康米相關 QQ&#xff1a;1203361015 黑歷史 貼吧…

PyQt5學習系列之QMetaObject.connectSlotsByName

文章目錄 前言一、pandas是什么&#xff1f;二、使用步驟 1.引入庫2.讀入數據總結 學習記錄 QMetaObject.connectSlotsByName——自動將信號連接到槽&#xff08;函數&#xff09; 例如&#xff1a; from PyQt5.QtWidgets import QMainWindow, QPushButton from PyQt5.QtCore…

哪些類型的產品適合用3D形式展示?

隨著3D技術的蓬勃發展&#xff0c;眾多品牌和企業紛紛投身3D數字化浪潮&#xff0c;將產品打造成逼真的3D模型進行展示&#xff0c;消費者可以更加直觀地了解產品的特點和優勢&#xff0c;從而做出更明智的購買決策。 哪些產品適合3D交互展示&#xff1f; 產品3D交互展示具有直…

2024系統架構師--- 希賽模擬答案知識點

案例第一題&#xff1a; MVC架構包含&#xff1a;視圖、控制器、模型&#xff1b; 視圖&#xff08;View&#xff09;&#xff1a;視圖是用戶看到并與之交互的界面。視圖面向用戶顯示相關的數據&#xff0c;并能接收用戶的輸入數據&#xff0c;但是它并不能進行任何實際的業務…

深入探索微軟Edge:領略新一代瀏覽器的無限可能

深入探索微軟Edge&#xff1a;領略新一代瀏覽器的無限可能 在當今數字化時代&#xff0c;網絡瀏覽器已經成為我們日常生活中不可或缺的一部分。而隨著技術的不斷進步&#xff0c;瀏覽器的功能和性能也在不斷提升。微軟Edge作為微軟推出的全新一代瀏覽器&#xff0c;引領著瀏覽…

自己手寫一個字符串【C風格】

//字符串的常見操作 #include <iostream>#define MAX_SIZE 15 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Status;//狀態類型 typedef char ElemType;//元素類型typedef ElemType String[MAX_SIZE 1];//第一個字節記錄長度//***tring是數…

c#自動生成缺陷圖像-添加新功能(可從xml直接提取目標數據,然后進行數據離線增強)--20240524

在進行深度學習時,數據集十分重要,尤其是負樣本數據。 故設計該軟件進行深度學習數據預處理,最大可能性獲取較多的模擬工業現場負樣本數據集。 該軟件基于VS2015、.NETFrameWork4.7.2、OpenCvSharp1.0.0.0、netstandard2.0.0.0、SunnyUI3.2.9.0、SunnyUI.Common3.2.9.0及Ope…

C盤磁盤空間不夠用,怎樣將d盤的空間劃分給c盤?

C盤磁盤空間不夠用&#xff0c;怎樣將d盤的空間劃分給c盤&#xff1f; 背景&#xff1a;win10系統下。C盤原有50G&#xff0c;如今只剩下8G&#xff0c;已經捉襟見肘了&#xff0c;想從D盤&#xff0c;割100G給C盤&#xff0c;以后軟件能直接裝C盤了。操作步驟如下&#xff1a…

2024年人文藝術與創新教育國際學術會議(ICHAIE 2024)

2024年人文藝術與創新教育國際學術會議&#xff08;ICHAIE 2024) 2024 International Conference on Humanities, Arts and Innovation Education 一、【會議簡介】 隨著全球化的推進和科技的迅猛發展&#xff0c;人文藝術與創新教育在培養未來人才方面扮演著越來越重要的角色…

溫故而知新-導航【面試復習】

溫故而知新-導航【面試復習】 前言版權溫故而知新-導航【面試復習】最后 前言 2024-5-18 00:01:31 以下內容源自《【溫故而知新】【面試復習】》 僅供學習交流使用 版權 禁止其他平臺發布時刪除以下此話 本文首次發布于CSDN平臺 作者是CSDN日星月云 博客主頁是https://jsss…