面試刷題平臺項目總結

項目簡介:

面試刷題平臺是一款基于 Spring Boot + Redis+ MySQL+ Elasticsearch 的 面試刷題平臺,運用 Druid + HotKey + Sa-Token+ Sentinel 提高了系統的性能和安全性。

第一階段,開發基礎的刷題平臺,帶大家熟悉項目開發流程,實戰 Spring Boot 應用的快速開發。

第二階段,對項目功能進行擴展,精選4個真實業務場景,實戰企業主流后端技術如 Redis 緩存和高級數據結構、Elasticsearch 搜索引擎、Druid 連接池、并發編程、熱 key 探測的應用。

第三階段,對項目安全性進行優化,比如基于Sentinel 進行網站流量控制和熔斷、基于 Nacos 實現動態的 IP 黑白名單、基于 Sa-Token 實現同端登錄沖突檢測.基于 Redis 實現分級反爬蟲策略等。

項目收獲:

  • 如何結合 Redis + Caffeine + Hotkey 構建高性能實時緩存
  • 如何利用 Elasticsearch 實現靈活高效的內容搜索
  • 如何巧用 Redisson 高級數據結構,實現高性能的接口
  • 如何實現流量控制和動態IP 黑白名單,增強網站安全性
  • 如何實現登錄沖突檢測和分級反爬蟲策略,保護網站內容

用戶刷題日歷功能:

1、需求分析

為了鼓勵用戶多刷題并提升復盤體驗,系統需支持刷題日歷功能:每日用戶首次瀏覽題目自動記錄簽到,用戶可在前端通過圖表查看某一年內每日的刷題簽到情況。

2、技術方案

后端方案 - 位圖 (Bitmap)
位圖是一種用 bit 位 存儲狀態的極致節省空間的數據結構,適合大規模布爾值存儲。在刷題簽到場景,每個用戶用位圖記錄一年 365 天的簽到情況,每位表示一天是否簽到(0未簽到,1已簽到)。

  • 每年只需 46 字節 存儲(46 × 8 ≥ 365天)。
  • 100w 用戶 ≈ 43.8MB,1000w 用戶 ≈ 438MB,比Redis Set 節省數十倍內存。
  • 位操作配合位運算,查詢和寫入效率高,適合低成本支撐千萬級用戶的簽到服務。

3、后端開發

查詢刷題簽到記錄接口優化

  1. 減少 Redis IO 次數(批量拉取,減少請求)
    ? 問題: 循環內 .get(offset) 每天一次 Redis 請求,365 天等于 365 次請求,極大浪費網絡 IO。
    ? 優化方案: 用 RBitSet.asBitSet() 一次性從 Redis 拉完整的 BitSet 到內存,后續直接走 JVM 內存查詢,只發一次請求。

  1. 精簡返回值,減少數據傳輸
    ? 問題: 原本返回 Map<LocalDate, Boolean>,365 個鍵值對,數據量大、前端展示和后端計算都重。
    ? 優化方案: 直接返回簽到天數 List,只返回用戶簽到的 具體天數,大幅減少數據量和后端開銷,前端也好處理。

  1. 使用 nextSetBit 避免無意義遍歷
    ? 問題: 以前用循環從 1 到 365 全量遍歷,遇到未簽到的天也強行 bitSet.get(),浪費 CPU。
    ? 優化方案: 用 bitSet.nextSetBit(fromIndex) 跳躍式查找簽到天數,只遍歷有效位,CPU 計算量進一步降低。

總結一句話
從「多次 Redis IO」→「一次拉取內存」,從「全量 Map 返回」→「只返回簽到天數」,從「全量遍歷」→「跳躍查找」,讀請求的 Redis 壓力、CPU 開銷和網絡帶寬全方位優化,輕松應對 高并發、低成本、大規模 需求。

優化小結
總結出幾個實用優化思路

  1. 減少網絡請求或調用次數
  2. 減少接口傳輸數據的體積
  3. 減少循環和計算
  4. 通過客戶端計算減少服務端的壓力

分詞題目搜索功能

1、 需求分析

MySQL 的 like 查詢只能簡單模糊匹配,不能同時匹配多個關鍵詞,而且數據量一大就很慢,復雜條件寫起來也費勁。而 Elasticsearch 是專門做搜索的,支持分詞、多個關鍵詞、相關性排序,搜索又快又準,用戶體驗更好。簡單說:MySQL 查得出,Elasticsearch 查得爽。

2、 方案設計

設計 Elasticsearch 索引時,核心思路是根據業務搜索需求合理設置字段類型和分詞策略。

  • 標題、內容、答案這種需要全文搜索的字段,一般用 text 類型配合中文分詞器(比如 ik_max_word 做索引,ik_smart 做搜索),支持更精準的匹配;
  • 標簽、狀態這類用于精確過濾的字段,用 keyword;
  • 數值型比如 userId 用 long,
  • 時間字段用 date 并設置時間格式。
  • 通過 aliases 可以實現索引平滑切換,方便后期無感知升級。

這樣設計兼顧了搜索準確性、查詢效率和索引的可維護性。

3.1、數據同步

全量同步,通過實現 CommandLineRunner 接口的run() 方法,在 Spring Boot 啟動完畢后自動執行從數據庫中全量獲取數據。

  • 定時任務 每分鐘自動從數據庫撈取近 5 分鐘內有變動的題目數據,同步到 Elasticsearch,確保 ES 數據是準實時的。
  • @Scheduled 定時任務:每分鐘觸發 run() 方法; MySQL 查詢:listQuestionWithDelete(fiveMinutesAgoDate) 查 5 分鐘內有改動的題;

3.2、ES接口降級策略實現

通過try-catch 實現降級策略,通過捕獲 Elasticsearch 查詢時的異常(比如超時、連接失敗),當 ES 查詢失敗時,程序自動進入 catch 邏輯,執行 MySQL 的模糊查詢作為兜底方案,確保接口不報錯、服務可用。

3.3、防止重復執行定時任務

在分布式部署或集群環境中,多個實例的定時任務可能在同一時間觸發同一個任務邏輯,造成:①任務重復執行,②數據重復寫入,③外部服務被重復調用

解決方案:基于 Redis 的分布式鎖RLock。通過給定時任務方法加上自定義注解 @DistributedLock,實現一個可配置、可自動釋放的分布式鎖攔截器,確保同一時刻只有一個節點能執行任務。

總結:使用 AOP + 分布式鎖注解(使用 Redisson 提供的 RLock.tryLock() 方法),可以確保在分布式環境下,同一時刻只有一個線程(通常指一個服務節點)能成功執行該定時任務,其他線程或節點會被鎖攔住或放棄執行。

題目批量管理功能

批處理優化
一般情況下,我們可以從以下多個角度對批處理任務進行優化。

健壯性

健壯性是指系統在面對 異常情況 或 不合法輸入 時仍能表現出合理的行為。一個健壯的系統能夠 預見和處理異常,并且即使發生錯誤,也不會崩潰或產生不可預期的行為。

1、參數校驗提前

可以在數據庫操作前校驗參數,減少無效查詢。在當前添加題目到題庫的邏輯中,已校驗非空和題目、題庫存在性,但還缺少對題目是否已添加的校驗,導致可能重復插入,存在不必要的數據庫開銷。

2、異常處理

目前雖然有插入結果校驗和自定義異常,但部分異常未細化處理。可按異常類型分類處理,如唯一鍵沖突捕獲 DataIntegrityViolationException,數據庫或事務錯誤捕獲 DataAccessException,其他異常記錄詳細日志,便于排查。

穩定性

1、避免長事務

為避免長事務,批量操作應按批次分段處理,減少單次事務體量。若單條數據異常,只回滾當前批次,避免 10w 條全回滾,提升性能與穩定性。可通過新增方法實現分批事務控制。

具體實現:通過外層循環分批調用帶事務的方法,實現小批量事務處理,避免了長事務帶來的性能瓶頸和大范圍回滾風險,提升系統穩定性和并發處理能力。這里必須用 AopContext.currentProxy() 獲取當前類的代理對象來調用事務方法,因為 Spring 的事務是基于代理實現的,若直接用 this 調用,繞過了代理,事務不會生效。用代理調用才能保證事務攔截器生效,實現真正的事務控制。

2、重試

對于可能由于網絡不穩定等臨時原因偶發失敗的操作,可以設計 重試機制 提高系統的穩定性,適用于執行時間很長的任務。

具體實現:通過在for循環中捕獲異常,失敗時記錄重試次數并繼續嘗試,成功則跳出循環,超過最大重試次數仍失敗時拋出業務異常,實現簡單的重試機制保障操作可靠性。

性能優化

1、批量操作

當前代碼中,每個題目是單獨插入數據庫的,這會產生頻繁的數據庫交互。利用MyBatis Plus 的 saveBatch 方法,①降低數據庫連接和提交的頻率,②避免頻繁的數據庫交互,減少IO操作

2、SQL優化

最基本的 SQL優化原則,不使用 select * 來查詢數據,只查出需要的字段即可。不要返回整個Question對象,只返回題目ID即可。

3、并發編程

利用并發包中的 CompletableFuture +線程池來并發處理多個任務。CompletableFuture默認使用 ForkJoinPool 線程池,適合分治和遞歸任務。ForkJoinPool 采用工作竊取算法(從其他線程“竊取”任務),提高 CPU 利用率,通過拆分小任務并行執行,最后合并結果。

CompletableFuture 默認使用全局共享的 ForkJoinPool.commonPool(),多任務共用可能導致資源爭搶和阻塞,建議針對不同任務自定義線程池實現資源隔離。

自定義線程配置:核心線程數4、最大線程數10,線程空閑60秒后銷毀超過核心數的線程,使用容量為1000的阻塞隊列存放任務,拒絕策略為CallerRunsPolicy(由調用線程執行任務)

4、 異步任務優化

立即執行異步任務:@Async注解
定時任務:將數據保存在Mysql中,通過Spring Scheduler定時任務掃描數據庫中未執行的任務。
消息隊列:對于對于長時間的批量任務,可以用消息隊列(RabbitMQ,Kafka)異步處理,將任務放入消息隊列,由消費者后臺異步執行。

5、數據庫連接調優

通過Druid復用數據庫連接,而不是在每次請求都新建和銷毀連接

Druid配置:初始連接數為10,最小空閑連接數為10,最大空閑連接數為10,超時等待(沒連接了,線程需要等多久)時間為6秒,每隔2秒檢測一次。

數據一致性

1、事務管理

我們目前已經使用了 @Transactional(rollbackFor = Exception.class)來保證一致性。如果任意一步操作失敗,整個事務會回滾,確保數據一致性。

2、并發管理

在高并發場景下,如果多個管理員同時向同一個題庫添加題目,可能會導致沖突或性能問題。為了解決并發問題,確保數據一致性和穩定性,可以有2種常見的策略

  • 增加 分布式鎖 來防止同一個接口(或方法)在同一時間被多個管理員同時操作,比如使用 Redis + Redisson 實現分布式鎖。
  • 如果要精細地對某個數據進行并發控制,可以選用 樂觀鎖。比如通過給 questionBank 表增加一個 version 字段,在更新時檢查版本號是否一致,確保對同一個題庫的并發操作不會相互干擾。

自動緩存熱門題庫

1、需求分析

系統如何自動發現熱點數據將其緩存在本地或Redis中?
具體的規則:對于獲取題庫詳情的請求,如果5秒內訪問>=10 次,就要使用本地緩存將題庫詳情緩存 10 分鐘,之后都從本地緩存讀取。

2、方案設計

自動緩存熱門題庫需要以下五個步驟:

  • 記錄訪問:用戶每訪問一次題庫,統計次數+1
  • 訪問統計:統計一段時間內題庫的訪問次數。這是最難實現的一部分
  • 閾值判斷:訪問頻率超過一定的閾值,變為熱點數據。
  • 緩存數據:緩存熱點數據
  • 獲取數據:后續訪問時,從緩存中獲取數據

HotKey組成部分

  • Worker:分布式計算集群,基于滑動窗口計算,根據dashboard里配置的rule規則,進行熱key推送。
  • Dashboard控制臺:ETCD集群,修改熱key規則配置信息
  • 實例:拉起并監聽各worker信息;采集 key 使用數據,傳給 Worker,讓 Worker 判斷是不是熱 key

流程:

  1. 各worker上報自己信息到ETCD,維持心跳。
  2. 實例監采集 key 使用數據,傳給 Worker,讓 Worker 判斷是不是熱key。
  3. 實例建立和各worker的長連接,基于netty,將探測的key按hash算法分發到不同worker進行計算。
  4. worker推送探測出的熱key到各實例,實例接受熱key信息,在JVM中緩存。

3、后端實現

HotKey配置規則:本地最大緩存Caffeine設置為10000(個鍵值對);每隔1秒推送熱點Key

通過JdHotKeyStore.isHotKey(key) 用來判斷 這個題目的 key 是否是熱點 key,就是看看這個題是不是近期高頻訪問、特別“燙手”的熱門數據。

再通過JdHotKeyStore.smartSet(key, questionBankVO)將判斷為熱點 key的數據緩存到本地緩存(Caffeine)

網站流量控制和熔斷(Sentinel)

1、需求分析

對查看題目列表接口整體限流

限流規則:

  • 策略:整個接口每秒鐘不超過 10 次請求
  • 阻塞操作:提示“系統壓力過大,請耐心等待”

熔斷規則:

  • 熔斷條件:如果接口異常率超過 10%,或者慢調用(響應時長>3秒)的比例大于 20%,觸發 60 秒熔斷。
  • 熔斷操作:直接返回本地數據(緩存或空數據)

單 IP 查看題目列表限流熔斷

限流規則:

  • 策略:每個IP 地址每分鐘允許查看題目列表的次數不能超過 60 次。
  • 阻塞操作:提示“訪問過于頻繁,請稍后再試”

熔斷規則:

  • 熔斷條件:如果接口異常率超過 10%,或者慢調用(響應時長>3秒)的比例大于 20%,觸發 60 秒熔斷。
  • 熔斷操作:直接返回本地數據(緩存或空數據)。

2、后端開發

使用 Sentinel 來進行資源保護,主要分為幾個步驟

  1. 定義資源
  2. 定義規則
  3. 檢驗規則是否生效

開發模式:用注解定義資源 +基于控制臺定義規則

對查看題目列表接口整體限流

資源的定義是通過 @SentinelResource 注解完成的,value 字段就代表 “資源名稱”。 blockHandler、fallback 分別指定 限流/降級兜底方法

每次調用這個接口,Sentinel 底層就會創建一個 Entry,資源名 = listQuestionBankVOByPage,開始走限流、降級判斷;

單IP查看題目列表限流熔斷

1?、定義資源

  • 資源名稱是:listQuestionVOByPage
  • 通過:
    • SphU.entry(“listQuestionVOByPage”, EntryType.IN, 1, remoteAddr)明確標識“按接口 + IP”作為限流和熔斷的維度。

2?、限流規則(ParamFlowRule)

  • 目標:針對單個 IP 限流
  • 規則配置:
    • setParamIdx(0):按第一個參數(remoteAddr,IP 地址)限流
    • setCount(60):每個 IP 每分鐘最多請求 60 次
    • setDurationInSec(60):統計周期 60 秒
  • 效果:短時間內某個 IP 請求次數超限,直接限流。

3?、熔斷規則(DegradeRule)

  • 慢調用熔斷:
    • 過去 30 秒內,調用量超過 10 次
    • 慢調用(>3秒)的比例超過 20% 時熔斷
    • 熔斷時間:60 秒
  • 異常率熔斷:
    • 過去 30 秒內,調用量超過 10 次
    • 異常比例超過 10% 時觸發熔斷
    • 熔斷時間:60 秒
  • 核心效果:接口響應時間持續過長或異常率高時主動熔斷,保護后端。

4?、代碼兜底邏輯

  • 限流/熔斷命中時觸發 fallback:
    • handleFallback():可返回空數據或緩存數據
  • Tracer.trace():主動記錄非限流業務異常
  • BlockException 判斷:精準區分業務異常 vs 限流/熔斷異常

按IP限流與單個接口限流的區別

資源名:listQuestionVOByPage 是唯一標識

無論是整體接口限流,還是基于 IP 限流,資源名都是一樣的,都是 “listQuestionVOByPage”,它代表了業務接口這個“大對象”。


1?、對整個接口限流

  • 不傳熱點參數,或限流規則不配置熱點參數維度(ParamFlowRule):
    • 調用時:SphU.entry(“listQuestionVOByPage”)(沒有參數傳入)
    • 限流規則針對整個資源整體請求數限制,比如每秒不超過 1000 次
    • 這時限流統計的是所有請求加起來的流量,不區分用戶或 IP。

2?、對 IP 維度限流

  • 調用時傳熱點參數(IP),并配置 ParamFlowRule 綁定參數索引:
    • 調用時:SphU.entry(“listQuestionVOByPage”, EntryType.IN, 1, remoteAddr)
    • 限流規則:setParamIdx(0),表示按第一個參數(IP)做限流
    • Sentinel 會針對每個不同 IP 單獨統計和限流,互不影響

動態IP黑名單過濾(Nacos)

1、需求分析

通過IP封禁,有效拉黑攻擊者,防止資源濫用。

2、方案設計

  • 使用 Nacos 配置中心存儲和管理 IP 黑名單
  • 后端服務利用 Web 過濾器判斷每個用戶請求的 IP
  • 后端服務利用布隆過濾器過濾 IP 黑名單

3、后端實現

動態接收黑名單配置,用布隆過濾器高效判斷 IP 是否被拉黑,兼顧“性能高”“內存省”“更新靈活”。

1?、存儲結構:BitMapBloomFilter

  • bloomFilter:用 布隆過濾器 存儲黑名單 IP,快速判斷是否存在,查詢 O(1),內存占用極低,允許極小誤判但不會漏判。

2?、isBlackIp() 方法

  • isBlackIp(String ip):對外暴露接口,用布隆過濾器判斷某個 IP 是否是黑名單命中

3?、rebuildBlackIp() 方法

  • 支持 動態刷新黑名單:
    • 接收最新的黑名單配置(configInfo),通常是字符串(YAML 格式)。
    • 用 SnakeYAML 解析出 IP 列表。
    • 同步加鎖 確保黑名單重建時線程安全;對 BlackIpUtils.class 加鎖,是為了確保 全局唯一 的布隆過濾器在更新時不會出現多線程并發覆蓋,保障重建過程的原子性和數據完整性。
    • 重新生成 bloomFilter 實例,切換成新的黑名單。

基于 Nacos 的動態配置監聽機制

NacosListener 通過實現 InitializingBean 接口,結合線程安全的 AtomicInteger 和異步線程池,在 Spring 啟動完成后第一時間注冊監聽器,同時配置變更的回調由 Nacos 客戶端通過長輪詢機制自動觸發,通過注冊 Listener 并保持 SDK 正常運行,就會在后臺自動拉配置、自動比對并調用 receiveConfigInfo() 方法確保系統可以動態感知黑名單配置變更并實時刷新本地數據,提升可用性和動態調控能力。

創建黑名單過濾器

黑名單應該對所有請求生效(不止是 Controller 的接口),所以基于 WebFilter 實現而不是 AOP 切面。
WebFilter 的優先級高于 @Aspect 切面,因為它在整個 Web 請求生命周期中更早進行處理。請求進入時的順序:

  • WebFilter:首先,Webfilter 攔截 HTTP 請求,并可以根據邏輯決定是否繼續執行請求。
  • Spring AOP切面(@Aspect):如果請求經過過濾器并進入 Spring 管理的 Bean(例如 Controller層),此時切面生效,對匹配的Bean 方法進行攔截。
  • Controller層:如果 @Aspect 沒有阻止執行,最終請求到達 @Controller或@RestController 的方法。

題目分級反爬蟲

1、需求分析

知識付費類網站以內容為核心,一旦被惡意爬蟲大規模抓取,不僅可能造成數據泄露和濫用,還會加重服務器負擔,影響正常用戶體驗。因此,需要部署有效的反爬蟲機制來保障系統安全與內容價值。

2、技術方案

建議采用分級反爬蟲策略,先告警、再采取強制措施,可以有效減少誤封的風險:

  • 如果每分鐘超過 10 道題目,則給管理員發送告警,比如發送郵件或者短信。
  • 如果每分鐘超過 20 道題目,則直接將賬號踢下線,且進行封號操作。(或者限制一段時間無法訪問)

3、后端開發

設計 Redis 鍵值對要能區分出用戶和時間窗,示例 key 為 user:access:{userId}:{timestamp_in_minutes}

  • {userld} 是用戶 ID。
  • {timestamp_in_minutes}是當前的分鐘級時間戳,即將當前時間戳轉化為分鐘,這樣每分鐘的訪問都會被統計到一個 key 中。

每個 key 的 value,就是該用戶在這分鐘內的訪問次數。

Redis操作邏輯

在反爬蟲場景中,我們常用 Redis 來做 訪問頻率統計,通過統計單位時間內某個 IP 或用戶的請求次數,判斷是否觸發限流或封禁。

傳統寫法的問題:
jedis.incr(key); // 第一步:計數
jedis.expire(key, 60); // 第二步:設置60秒過期。
問題:如果多線程訪問,你原本想統計“某個 IP 在 60 秒內訪問了多少次”; 實際上由于每次訪問都把 TTL 重新設為 60s,所以這個 key 一直存在,永遠不會自動清除;

解決辦法:用 Lua 保證原子 + 只設一次 TTL 的

總結:在高并發場景中,incr 和 expire 是非原子操作,容易導致 TTL 被頻繁重置,造成 Redis key 永久存在,失去限流窗口的意義。通過 Lua 腳本保證“只設一次 TTL”,可以有效避免這個問題。

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

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

相關文章

負載均衡、算法/策略

負載均衡一、負載均衡層級對比特性四層負載均衡 (L4)七層負載均衡 (L7)工作層級傳輸層 (TCP/UDP)應用層 (HTTP/HTTPS等)決策依據源/目標IP端口URL路徑、Header、Cookie、內容等轉發方式IP地址/端口替換重建連接并深度解析報文性能更高吞吐量&#xff0c;更低延遲需內容解析&…

StackingClassifier參數詳解與示例

StackingClassifier參數詳解與示例 StackingClassifier是一種集成學習方法&#xff0c;通過組合多個基分類器的預測結果作為元分類器的輸入特征&#xff0c;從而提高整體模型性能。以下是關鍵參數的詳細說明和示例&#xff1a; 1. classifiers&#xff08;基分類器&#xff09;…

嵌入式中間件-uorb解析

uORB系統詳細解析 1. 系統概述 1.1 設計理念 uORB&#xff08;Micro Object Request Broker&#xff09;是一個專為嵌入式實時系統設計的發布-訂閱式進程間通信框架。該系統借鑒了ROS中topic的概念&#xff0c;為無人機飛控系統提供了高效、可靠的數據傳輸機制。 1.2 核心特征 …

HTTP.Client 庫對比與選擇

HTTP.Client 庫對比與選擇在 Python 中&#xff0c;除了標準庫 http.client&#xff0c;還有許多功能更強大、使用更便捷的 HTTP 庫。以下是一些常用的庫及其特點&#xff1a;1. Requests&#xff08;最流行&#xff09;特點&#xff1a;高層 API&#xff0c;簡單易用&#xff…

RabbitMQ面試精講 Day 5:Virtual Host與權限控制

【RabbitMQ面試精講 Day 5】Virtual Host與權限控制 開篇 歡迎來到"RabbitMQ面試精講"系列的第5天&#xff01;今天我們將深入探討RabbitMQ中Virtual Host與權限控制的核心機制&#xff0c;這是構建安全、隔離的消息系統必須掌握的重要知識。在面試中&#xff0c;面…

【前端實戰】純HTML+CSS+JS實現蠟筆小新無盡冒險:從零打造網頁版超級瑪麗

摘要&#xff1a;本文將詳細介紹一款完全由HTMLCSSJS實現的網頁版橫版闖關游戲——"蠟筆小新無盡冒險"。游戲采用純前端技術實現&#xff0c;無需任何外部依賴&#xff0c;完美復刻了經典超級瑪麗的核心玩法&#xff0c;并創新性地融入了蠟筆小新角色元素。通過本文&…

[工具類] 網絡請求HttpUtils

引言在現代應用程序開發中&#xff0c;網絡請求是必不可少的功能之一。無論是訪問第三方API、微服務之間的通信&#xff0c;還是請求遠程數據&#xff0c;都需要通過HTTP協議實現。在Java中&#xff0c;java.net.HttpURLConnection、Apache的HttpClient庫以及OkHttp等庫提供了豐…

基于Spring Boot的裝飾工程管理系統(源碼+論文)

一、 開發環境與技術 本章節對開發裝飾工程管理系統------項目立項子系統需要搭建的開發環境&#xff0c;以及裝飾工程管理系統------項目立項子系統開發中使用的編程技術等進行闡述。 1 開發環境 工具/環境描述操作系統Windows 10/11 或 Linux&#xff08;如 Ubuntu&#x…

【WebGPU學習雜記】數學基礎拾遺(2)變換矩陣中的齊次坐標推導與幾何理解

今天打算開始 3D 數學基礎的復習&#xff0c;本文假設你了解以下概念&#xff1a;一次多項式、矩陣、向量&#xff0c;基于以上拓展的概念 歸一化、2&#xff5e;3階矩陣的幾何意義。幾何意義結論 齊次坐標是對三維的人工的特定的升維&#xff0c;它是一個工具而已。圖形學中常…

JS前端壓縮算法——WWDHCAPOF-算法導論論文——東方仙盟算法

代碼function customCompressString(input) {// 第一步&#xff1a;將字符串轉換為ANSI碼數組并乘以位置序號let resultArray Array.from(input).map((char, index) > {const ansiCode char.charCodeAt(0);return ansiCode * (index 東方仙盟); // 位置序號從1開始});// …

linux命令less的實際應用

less 是 Linux/Unix 中交互式文件查看神器&#xff0c;相比 more 和 cat&#xff0c;它支持自由導航、搜索、高亮等強大功能&#xff0c;尤其適合處理大文件或實時日志。以下是深度應用指南&#xff1a;?一、核心優勢?less large_file.log # 秒開GB級文件&#xff08…

DAY31 整數矩陣及其運算

DAY31 整數矩陣及其運算 本次代碼通過IntMatrix類封裝了二維整數矩陣的核心操作&#xff0c;思路如下&#xff1a;數據封裝→基礎操作&#xff08;修改和獲取元素、獲取維度&#xff0c;toString返回字符串表示&#xff0c;getData返回內部數組引用&#xff09;→矩陣運算&…

飛槳深度學習環境搭建

一、安裝 PyCharm PyCharm 官網下載頁面 記得全部勾選。 二、安裝 miniconda miniconda 官網下載頁面 根據你的操作系統選擇。 記得勾選前三個。 三、安裝 CUDA 首先 nvidia-smi 查看支持最高的 CUDA 版本。 然后去 nvidia 官網下載 CUDA&#xff0c;選擇適合你的版本。 …

MySQL 8.0 OCP 1Z0-908 題目解析(37)

題目146 Choose two. Which two are true about binary logs used in asynchronous replication? □ A) The master connects to the slave and initiates log transfer. □ B) They contain events that describe all queries run on the master. □ C) They contain events …

vue element 封裝表單

背景&#xff1a; 在前端系統開發中&#xff0c;系統頁面涉及到的表單組件比較多&#xff0c;所以進行了簡單的封裝。封裝的包括一些Form表單組件&#xff0c;如下&#xff1a;input輸入框、select下拉框、等 實現效果&#xff1a; 理論知識&#xff1a; 表單組件官方鏈接&…

flutter-完美解決鍵盤彈出遮擋輸入框的問題

文章目錄1. 前言2. 借助 Scaffold 的特性自動調整3. 使用 MediaQuery 精準控制抬升高度3.1. 底部抽屜內輸入框的方案4. 注意事項5. 總結1. 前言 在 Flutter 的開發過程中&#xff0c;經常會碰到某一個頁面有個 TextField 輸入組件&#xff0c;點擊的時候鍵盤會彈起來&#xff…

機器學習筆記(四)——聚類算法KNN、Kmeans、Dbscan

寫在前面&#xff1a;寫本系列(自用)的目的是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解&#xff0c;方便自己以后快速復習&#xff0c;減少遺忘。概念部分大部分來自于機器學習菜鳥教程&#xff0c;公式部分也會參考機器學習書籍、阿里云天池。機器學習如果只啃概…

【C#】事務(進程 ID 64)與另一個進程被死鎖在鎖資源上,并且已被選作死鎖犧牲品。請重新運行該事務。不能在具有唯一索引“XXX_Index”的對象“dbo.Test”中插入重復鍵的行。

&#x1f339;歡迎來到《小5講堂》&#x1f339; &#x1f339;這是《C#》系列文章&#xff0c;每篇文章將以博主理解的角度展開講解。&#x1f339; &#x1f339;溫馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不對之處望指正&#xff01;&#…

LeetCode Hot 100 搜索二維矩陣

給你一個滿足下述兩條屬性的 m x n 整數矩陣&#xff1a;每行中的整數從左到右按非嚴格遞增順序排列。每行的第一個整數大于前一行的最后一個整數。給你一個整數 target &#xff0c;如果 target 在矩陣中&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。示例…

python畢設高分案例:基于機器學習的抑郁癥數據分析與預測系統,flask框架,算法包括XGboost模型、梯度提升樹模型等

1 緒論 1.1 課題研究背景和意義 1.1.1 研究背景 在醫療行業不斷發展的當下&#xff0c;數據量呈現出爆炸式增長&#xff0c;醫學數據的復雜性和多樣性也達到了前所未有的程度。電子病歷系統記錄了患者豐富的診療信息&#xff0c;醫學影像技術如 CT、MRI 等生成海量的圖像數據…