Docker快速部署Mongodb主副本集實踐

系列文章目錄

第一章 Mongodb的主副本集


文章目錄

  • 系列文章目錄
  • 前言
  • 一、Mongodb基礎介紹
      • 數據庫(Database)
      • 集合(Collection)
      • 文檔(Document)
      • BSON(Binary JSON)
      • _id(主鍵)
      • 索引(Index)
      • 分片(Sharding)
      • 副本集(Replica Set)
      • 聚合管道(Aggregation Pipeline)
      • CRUD 操作
      • 寫關注(Write Concern)
      • 讀偏好(Read Preference)
  • 二、Mongodb事務
      • 事務的基本概念
      • 啟用事務的前提條件
      • 事務的使用方法
      • 事務的隔離級別
      • 事務的寫關注
      • 事務的注意事項
      • 事務的性能優化
      • 事務的錯誤處理
      • 事務的限制
  • 三、Docker部署MongoDB主副本集
    • 環境準備
      • Docker安裝
      • 具體安裝
      • 驗證
  • 小結


前言

公司有項目需要滿足數據內容不固定,Mongodb更適合此業務,但是不支持事務,于是了解到主副本集可以滿足。


一、Mongodb基礎介紹

數據庫(Database)

Mongodb 中的數據庫是一組集合(Collection)的容器,每個數據庫在文件系統中有獨立的文件存儲。數據庫名稱區分大小寫,通常用于邏輯隔離不同應用或模塊的數據。

集合(Collection)

集合是 Mongodb 中存儲文檔(Document)的容器,類似于關系型數據庫中的表。集合不需要預先定義結構,可以動態存儲不同格式的文檔。集合名稱同樣區分大小寫。

文檔(Document)

文檔是 Mongodb 中的數據基本單元,采用 BSON(Binary JSON)格式存儲。文檔由鍵值對組成,鍵是字符串,值可以是多種數據類型(如字符串、數字、數組、嵌套文檔等)。例如:

{"name": "Alice","age": 30,"address": {"city": "New York","zip": "10001"}
}

BSON(Binary JSON)

BSON 是 JSON 的二進制編碼格式,擴展了 JSON 的數據類型(如日期、二進制數據等)。Mongodb 使用 BSON 在內部存儲和傳輸數據,支持高效查詢和索引。

_id(主鍵)

每個文檔必須包含一個唯一的 _id 字段作為主鍵。如果插入文檔時未指定 _id,Mongodb 會自動生成一個 ObjectId 類型的值。_id 字段默認建立索引。

索引(Index)

索引用于加速查詢性能,類似于關系型數據庫的索引。Mongodb 支持單字段索引、復合索引、多鍵索引(數組字段)、全文索引等。例如創建索引的命令:

db.collection.createIndex({ "name": 1 }) // 1表示升序,-1表示降序

分片(Sharding)

分片是 Mongodb 的橫向擴展機制,將數據分散到多個分片(Shard)上。每個分片是獨立的數據庫實例,共同組成一個邏輯數據庫。分片通過分片鍵(Shard Key)路由數據。

副本集(Replica Set)

副本集是一組維護相同數據的 Mongodb 實例,提供高可用性。包含一個主節點(Primary)和多個從節點(Secondary)。主節點處理寫操作,從節點同步數據并支持讀操作。

聚合管道(Aggregation Pipeline)

聚合管道是數據處理框架,通過多個階段(Stage)對文檔進行轉換和計算。每個階段處理輸入文檔并輸出結果到下一階段。常見階段包括 $match$group$sort 等。

CRUD 操作

CRUD 指 Mongodb 的基本數據操作:

  • CreateinsertOne()insertMany()
  • Readfind()findOne()
  • UpdateupdateOne()updateMany()
  • DeletedeleteOne()deleteMany()

寫關注(Write Concern)

寫關注定義寫操作的確認級別,控制數據持久化的可靠性。例如:

db.collection.insertOne({ "key": "value" },{ writeConcern: { w: "majority", j: true } } // w: 寫入節點數,j: 日志持久化
)

讀偏好(Read Preference)

讀偏好指定查詢請求的路由規則,允許從主節點或從節點讀取數據。選項包括 primarysecondarynearest 等,適用于讀寫分離場景。

二、Mongodb事務

事務的基本概念

MongoDB 從 4.0 版本開始支持多文檔事務,適用于副本集;從 4.2 版本開始支持分片集群的事務。事務提供 ACID 特性,確保數據操作的原子性、一致性、隔離性和持久性。

啟用事務的前提條件

MongoDB 事務需要運行在副本集或分片集群上,單機模式不支持事務。確保 MongoDB 實例已正確配置為副本集或分片集群。

事務的使用方法

在 MongoDB 中使用事務需要通過會話(Session)來管理。以下是一個基本的事務操作示例:

const session = db.getMongo().startSession();
session.startTransaction({readConcern: { level: "snapshot" },writeConcern: { w: "majority" }
});try {const collection1 = session.getDatabase("db1").collection1;const collection2 = session.getDatabase("db2").collection2;collection1.insertOne({ name: "Alice" }, { session });collection2.updateOne({ name: "Bob" }, { $set: { age: 30 } }, { session });session.commitTransaction();
} catch (error) {session.abortTransaction();throw error;
} finally {session.endSession();
}

事務的隔離級別

MongoDB 提供 snapshot 隔離級別,確保事務內讀取的數據來自同一快照。可以通過 readConcern 設置:

readConcern: { level: "snapshot" }

事務的寫關注

事務中的寫操作可以通過 writeConcern 指定確認級別,通常設置為 majority 以確保數據持久性:

writeConcern: { w: "majority" }

事務的注意事項

事務中的操作必須顯式指定會話(Session),否則操作不會包含在事務中。事務的執行時間不宜過長,避免鎖競爭和性能問題。事務支持的文檔操作包括插入、更新、刪除和查詢。

事務的性能優化

為了減少事務對性能的影響,盡量縮小事務范圍,減少事務內的操作數量。避免在事務中執行耗時操作,如大規模數據掃描。合理設置事務超時時間,防止長時間占用資源。

事務的錯誤處理

事務執行過程中如果發生錯誤,必須捕獲異常并顯式調用 abortTransaction 回滾事務。確保事務結束后調用 endSession 釋放會話資源。

事務的限制

MongoDB 事務不支持某些操作,如創建或刪除集合、創建或刪除索引。事務內的寫操作不能影響分片鍵的值。單個事務的文檔修改量默認限制為 16MB,超過會導致錯誤。


三、Docker部署MongoDB主副本集

環境準備

  • linux服務器,內存不少于8G,cpu至少I5,磁盤500G起步,這里我用的是CentOS7,架構是x86_64,通過如下命令確認

[root@host ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
[root@host ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                16
On-line CPU(s) list:   0-15
Thread(s) per core:    2
Core(s) per socket:    8
座:                 1
NUMA 節點:         1
廠商 ID:           GenuineIntel
CPU 系列:          6
型號:              165
型號名稱:        Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
步進:              5
CPU MHz:             800.048
CPU max MHz:           4800.0000
CPU min MHz:           800.0000
BogoMIPS:            5800.00
虛擬化:           VT-x
L1d 緩存:          32K
L1i 緩存:          32K
L2 緩存:           256K
L3 緩存:           16384K
NUMA 節點0 CPU:    0-15

Docker安裝

看 歐拉系統部署Docker實踐指南, 參考前面部分就行。

具體安裝

  • 鏡像用的是mongo最新版,可以直接拉取,也可以docker run時拉取
  • 這里配置3個,做1主兩從
  • 新建目錄,用于掛載存放配置文件
mkdir -p /home/mongodb  && chown -R 200 /home/mongodb
  • 確定主端口:27017,2個從分別是27018、27019
  • 命令列表

#自定義網絡
docker network create --subnet=172.18.0.0/16 my-network
# 查看已存在網絡
docker network ls
# mongo容器認證啟動方式
docker run --restart=always --privileged -p 27017:27017 --name mongodbMaster --network my-network --ip 172.18.0.1 -v /home/mongo/mongoMaster/config:/data/configdb -v /home/mongo/mongoMaster/db:/data/db -v /home/mongo/mongoMaster/logs:/data/log -d mongo --replSet rs
docker run --restart=always --privileged -p 27018:27017 --name mongodbSlave1 --network my-network --ip 172.18.0.2 -v /home/mongo/mongoSlave1/config:/data/configdb -v /home/mongo/mongoSlave1/db:/data/db -v /home/mongo/mongoSlave1/logs:/data/log -d mongo --replSet rs
docker run --restart=always --privileged -p 27019:27017 --name mongodbSlave2 --network my-network --ip 172.18.0.3 -v /home/mongo/mongoSlave2/config:/data/configdb -v /home/mongo/mongoSlave2/db:/data/db -v /home/mongo/mongoSlave2/logs:/data/log -d mongo --replSet rs
  • 執行docker images | grep mongo, 發現3個容器已經創建并運行
  • 進入容器,創建賬號、授權
docker exec -it mongodbMaster /bin/bash
進入MongoDB交互式命令行并切換到admin數據庫
mongo
use admin
//管理員 
db.createUser({ user: 'rwuser', pwd: 'xxxxx', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });
db.auth('rwuser', 'xxxxx') //返回1表示認證成功
db.getCollectionNames() //所有創建的用戶都會存儲在system.users集合中
//factory-dev
use factory-dev //切換到目標數據庫
db.createUser({ user: 'test', pwd: 'xxxxx', roles: [ { role: "readWrite", db: "db1" } ] });
db.auth('test', 'xxxxx') //返回1表示認證成功# 查看主節點,找到members[].stateStr:主節點應為 "PRIMARY",說明ok。
rs:PRIMARY> rs.status()
{"set" : "rs","date" : ISODate("2025-09-04T00:32:31.156Z"),"myState" : 1,"term" : NumberLong(335),"syncSourceHost" : "","syncSourceId" : -1,"heartbeatIntervalMillis" : NumberLong(2000),"majorityVoteCount" : 2,"writeMajorityCount" : 2,"votingMembersCount" : 3,"writableVotingMembersCount" : 3,"optimes" : {"lastCommittedOpTime" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"lastCommittedWallTime" : ISODate("2025-09-04T00:32:25.880Z"),"readConcernMajorityOpTime" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"appliedOpTime" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"durableOpTime" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"lastAppliedWallTime" : ISODate("2025-09-04T00:32:25.880Z"),"lastDurableWallTime" : ISODate("2025-09-04T00:32:25.880Z")},"lastStableRecoveryTimestamp" : Timestamp(1756945915, 1),"electionCandidateMetrics" : {"lastElectionReason" : "electionTimeout","lastElectionDate" : ISODate("2025-09-03T06:59:13.712Z"),"electionTerm" : NumberLong(335),"lastCommittedOpTimeAtElection" : {"ts" : Timestamp(1756882537, 1),"t" : NumberLong(334)},"lastSeenOpTimeAtElection" : {"ts" : Timestamp(1756882547, 1),"t" : NumberLong(334)},"numVotesNeeded" : 2,"priorityAtElection" : 1,"electionTimeoutMillis" : NumberLong(10000),"numCatchUpOps" : NumberLong(0),"newTermStartDate" : ISODate("2025-09-03T06:59:13.799Z"),"wMajorityWriteAvailabilityDate" : ISODate("2025-09-03T06:59:14.450Z")},"electionParticipantMetrics" : {"votedForCandidate" : true,"electionTerm" : NumberLong(333),"lastVoteDate" : ISODate("2025-09-03T06:54:18.247Z"),"electionCandidateMemberId" : 2,"voteReason" : "","lastAppliedOpTimeAtElection" : {"ts" : Timestamp(1756882339, 1),"t" : NumberLong(331)},"maxAppliedOpTimeInSet" : {"ts" : Timestamp(1756882339, 1),"t" : NumberLong(331)},"priorityAtElection" : 1},"members" : [{"_id" : 0,"name" : "f1737b1cbbc5:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 63539,"optime" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"optimeDate" : ISODate("2025-09-04T00:32:25Z"),"lastAppliedWallTime" : ISODate("2025-09-04T00:32:25.880Z"),"lastDurableWallTime" : ISODate("2025-09-04T00:32:25.880Z"),"syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "","electionTime" : Timestamp(1756882753, 1),"electionDate" : ISODate("2025-09-03T06:59:13Z"),"configVersion" : 5,"configTerm" : 335,"self" : true,"lastHeartbeatMessage" : ""},{"_id" : 1,"name" : "172.18.0.1:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 63207,"optime" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"optimeDurable" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"optimeDate" : ISODate("2025-09-04T00:32:25Z"),"optimeDurableDate" : ISODate("2025-09-04T00:32:25Z"),"lastAppliedWallTime" : ISODate("2025-09-04T00:32:25.880Z"),"lastDurableWallTime" : ISODate("2025-09-04T00:32:25.880Z"),"lastHeartbeat" : ISODate("2025-09-04T00:32:31.006Z"),"lastHeartbeatRecv" : ISODate("2025-09-04T00:32:31.009Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncSourceHost" : "f1737b1cbbc5:27017","syncSourceId" : 0,"infoMessage" : "","configVersion" : 5,"configTerm" : 335},{"_id" : 2,"name" : "172.18.0.2:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 63206,"optime" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"optimeDurable" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"optimeDate" : ISODate("2025-09-04T00:32:25Z"),"optimeDurableDate" : ISODate("2025-09-04T00:32:25Z"),"lastAppliedWallTime" : ISODate("2025-09-04T00:32:25.880Z"),"lastDurableWallTime" : ISODate("2025-09-04T00:32:25.880Z"),"lastHeartbeat" : ISODate("2025-09-04T00:32:31.009Z"),"lastHeartbeatRecv" : ISODate("2025-09-04T00:32:31.006Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncSourceHost" : "f1737b1cbbc5:27017","syncSourceId" : 0,"infoMessage" : "","configVersion" : 5,"configTerm" : 335}],"ok" : 1,"$clusterTime" : {"clusterTime" : Timestamp(1756945945, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}},"operationTime" : Timestamp(1756945945, 1)
}
  • 一定要注意mongoDB重啟順序:docker start mongodbMaster,docker start mongodbSlave1,docker start mongodbSlave2
    先啟動mongodbMaster那個就會成為PRIMARY,也是可以讀寫的,其他的都是副本集,屬于SECONDARY,只能讀

驗證

  • 使用Navicat數據庫連接工具,點擊連接,選擇monogb
    連接

  • 輸入ip 端口,賬號、密碼、數據庫名,這里端口填寫主端口27017,最后點擊一下"測試連接",返回OK說明配置連接成功。
    填配

  • 右鍵新一個數據庫test
    數據庫

  • 選擇集合,新建一個集合demo1
    新建集合

  • 建表SQL,我這里用的是腳本執行的

// ----------------------------
// Collection structure for autoId
// ----------------------------
db.getCollection("demo1").drop();
db.createCollection("demo1");// ----------------------------
// Documents of autoId
// ----------------------------
db.getCollection("demo1").insert([ {_id: "6394049da732a862951f5a62",    autoId: NumberInt("1288641"),collectionName: "product"
} ]);

執行腳本

  • 插入成功后,效果如下
    查詢

  • 事務驗證這塊,因為使用的代碼驗證的,你們只能自行用代碼驗證了,方法很簡單,開啟事務后,先執行一個插入,再制造一個異常,比如 1/0, 看數據是否回滾。


小結

  • 遇到無法寫入數據時,先進入任何一個容器
    比如 docker exec -it mongodbMaster /bin/bash
    mongo
    rs.status();
    查看
    members[].stateStr:主節點應為 “PRIMARY”。
    members[].health:健康節點值為 1。
    若都為SECONDARY,說明還沒有確定誰是PRIMARY,先等一會再執行看看是否有PRIMARY,有的那個就是可以連接和讀寫的容器
    若一直都是SECONDARY,就要檢查容器情況了。

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

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

相關文章

FC平臺安裝Windows Server2016并連接V6存儲

創建 windows server2016 上傳ISO創建虛擬機安裝OS 加載光盤掛載成功之后,重啟虛擬機重啟之后VNC登錄即可。在FC上安裝windows,安裝完成后,必須安裝tools工具,不然沒有虛擬網卡,無法配置ip地址。Windows主機安裝toolsW…

農業XR數字融合工作站,賦能農業專業實踐學習

隨著數字技術與農業的深度融合,農業專業XR數字融合工作站為農業專業學生提供了沉浸式、交互式的學習體驗。農業專業XR數字融合工作站作為集PC、VR、MR技術于一體的軟硬件集成平臺,通過虛擬仿真、數字孿生等技術手段,有效解決了傳統農業教育中…

積分球的使用——簡易版

這篇寫的比較雜。積分球的功能積分球——測量燈具等光源的總光通量、光效、色溫、顯色指數等參數。使用方法1.開啟積分球系統(探測器、光度計、光譜儀),充分預熱(15-30分鐘),使得電子設備穩定,減…

[光學原理與應用-435]:晶體光學 - 晶體的結構-基元/原胞/晶胞/點陣

晶體的結構可通過基元、原胞、晶胞和點陣四個核心概念進行系統描述,它們共同揭示了晶體中原子排列的周期性與對稱性規律,具體如下:1. 基元(Structure Motif)定義:基元是晶體中重復排列的最小結構單元&#…

電腦音頻錄制 | 系統麥克混錄 / 系統聲卡直錄 | 方法匯總 / 常見問題

注:本文為 “電腦音頻錄制 ” 相關合輯。 英文引文,機翻未校。 未整理去重,如有內容異常,請看原文。 How to Record Computer Audio in 6 Free Ways 如何用 6 種免費方式錄制電腦音頻 Sponsored by EaseUS Nov 28, 2023 4:34 a…

2025高教社國賽數學建模競賽B題完整參考論文(含模型和代碼)

2025國賽數學建模競賽B題完整參考論文 目錄 一、 問題重述 1.1 問題背景 1.2 問題回顧與分析 二、 模型假設 三、 符號說明 四、 問題求解與分析 4.1數據預處理 4.2 問題1求解與分析 4.2.1 問題1分析 4.2.2 問題1建模與求解 4.2.3 問題1結果與分析 4.3 問題2求解與分…

OpenSSL 1.0.1e 下載解壓和運行方法(小白適用 附安裝包)?

openssl-1.0.1e.zip? 是 OpenSSL 加密工具包的一個舊版本(發布于 2013 年左右)的 ?源代碼壓縮包,文件格式是 ZIP 壓縮格式。 一、下載與解壓 ?下載文件? 假如你已經有了 openssl-1.0.1e.zip 這個壓縮包,就跳過這步。 如果沒有…

MapStruct詳解

提到屬性拷貝,首先想到的BeanUtils。 先簡單的回憶下BeanUtils,處理Java Bean之間的屬性拷貝;不過由于它是通過反射來拷貝屬性,在數據量大一些的時候性能會降低; 且在安全方面也會比較弱; MapStruct是編譯期…

8.FC平臺模塊梳理

文章目錄8.FC平臺模塊梳理8.1. 內存復用技術特點應用價值8.2. 虛擬機啟用策略8.3. NUMA8.4. HA高可用8.5. 故障和響應策略8.6. DRS 和 DPM8.7. IMC8.FC平臺模塊梳理 8.1. 內存復用 內存共享內存交換內存氣泡 內存共享:多臺虛擬機共享數據內容相同的內存頁。內存交換…

貪心算法應用:DNA自組裝問題詳解

JAVA中的貪心算法應用:DNA自組裝問題詳解 1. DNA自組裝問題概述 DNA自組裝(DNA Self-Assembly)是分子計算和納米技術中的一個重要問題,它利用DNA分子的互補配對特性,通過精心設計DNA序列,使其自發地組裝成預定的納米結構。在計算機…

數據湖如何打造統一存儲與處理方案(結構化數據、半結構化數據和非結構化數據)

目錄 1. 數據湖的“包容哲學”:為什么需要統一方案? 數據湖的核心訴求 案例:零售企業的痛點 2. 存儲層設計:給數據找個舒適的家 分區與分層存儲 選擇存儲格式 案例:Parquet的威力 云存儲的選擇 3. 元數據管理:給數據湖裝上“導航儀” 元數據管理的核心組件 主流…

AUTOSAR進階圖解==>AUTOSAR_SWS_TTCANDriver

TTCAN驅動器詳細規范 AUTOSAR TTCAN Driver Specification with Enhanced Visual Documentation目錄 1. 概述2. TTCAN控制器狀態機3. TTCAN模塊架構4. TTCAN時間觸發操作序列5. TTCAN錯誤處理流程6. 總結 1. 概述 TTCAN(Time-Triggered CAN)驅動器是AU…

equals 定義不一致導致list contains錯誤

錯誤代碼如下&#xff1a;for (int i0;i< rows.size();i) {Row r rows.get(i);if (r.equals(row)) {assertTrue(rows.contains(row));return;}}cassertTrue(rows.contains(row));返回了false&#xff0c;看起來很奇怪&#xff0c;此時equals 定義如下&#xff1a;public bo…

【Python基礎】 20 Rust 與 Python 循環語句完整對比筆記

一、基本循環結構對比 Rust 循環類型 // 1. loop - 無限循環 let mut count 0; loop {count 1;if count > 5 {break;} }// 2. while - 條件循環 let mut number 3; while number ! 0 {println!("{}!", number);number - 1; }// 3. for - 迭代循環 for i in 0..…

Redis 在互聯網高并發場景下的應用--個人總結

在現代互聯網系統中&#xff0c;高并發已經成為常態。無論是電商的秒殺場景、社交平臺的熱點推薦&#xff0c;還是支付接口的風控&#xff0c;系統需要同時應對成千上萬的請求。這時候&#xff0c;Redis 作為一個高性能的內存數據庫&#xff0c;憑借其極快的讀寫速度和豐富的數…

C++筆記之軟件設計原則總結

C++筆記之軟件設計原則總結 code review 文章目錄 C++筆記之軟件設計原則總結 1.軟件設計的六大原則 2.高內聚與低耦合 2.1.高內聚(High Cohesion) 2.2.低耦合(Low Coupling) 2.3.高內聚與低耦合的關系與重要性 3.DRY(Dont Repeat Yourself)原則 3.1.定義 3.2.好處 3.3.示…

ThreadLocal 深度解析:原理、應用場景與最佳實踐

一、ThreadLocal 核心概念與設計哲學?1.1 ThreadLocal 的基本概念?ThreadLocal 是 Java 中提供線程局部變量的類&#xff0c;它允許每個線程創建自己的變量副本&#xff0c;從而實現線程封閉&#xff08;Thread Confinement&#xff09;。簡單來說&#xff0c;ThreadLocal 為…

AMD顯卡運行GPT-OSS全攻略

AMD顯卡運行GPT-OSS全攻略 本文介紹如何在Windows系統上使用AMD顯卡&#xff08;以RX 7900XTX為例&#xff09;運行開源GPT-OSS模型。 前置要求 硬件&#xff1a;AMD顯卡&#xff08;如RX 7900XTX&#xff0c;具體支持型號參考ROCm文檔&#xff09;。軟件&#xff1a; Ollam…

【Sharding-JDBC】?Spring/Spring Boot 集成 Sharding-JDBC,分表策略與 API、YAML 配置實踐?

文章目錄環境準備Spring框架Sharding-JDBC 4.x版本api實現Sharding-JDBC 5.4.x版本yaml實現Springboot框架Sharding-JDBC 5.4.x版本yaml實現分庫、加密、讀寫分離基于yaml的配置示例更多相關內容可查看需求&#xff1a;按月分區&#xff0c;按年分表&#xff0c;找不到對應年份…

單片機和PLC有哪些區別?揭秘單片機MCU的常見應用

單片機&#xff08;MCU&#xff09;和可編程邏輯控制器&#xff08;PLC&#xff09;作為電子控制系統中的兩大核心組件&#xff0c;分別在不同的領域發揮著重要作用。然而&#xff0c;盡管它們都屬于自動化控制領域的關鍵設備&#xff0c;但它們的設計理念、應用場景和性能特點…