MongoDB數(shù)據(jù)庫(kù)介紹和Java使用

MongoDB簡(jiǎn)介

????????MongoDB是一個(gè)開(kāi)源的面向文檔存儲(chǔ)的NoSQL數(shù)據(jù)庫(kù),它沒(méi)有了表結(jié)構(gòu)的概念和數(shù)據(jù)結(jié)構(gòu)的限制;一個(gè)數(shù)據(jù)庫(kù)包含多個(gè)集合,每個(gè)集合理論上包含無(wú)數(shù)個(gè)文檔,每個(gè)文檔就是一條記錄;每個(gè)文檔的格式都是BSON格式,BSON是一種類(lèi)JSON的一種二進(jìn)制形式的存儲(chǔ)格式,簡(jiǎn)稱Binary JSON;文檔的最大存儲(chǔ)空間是16M,當(dāng)文件大小超過(guò)16M之后要使用MongoDB的GridFS;GridFS適合大文件的存儲(chǔ),本質(zhì)上是將大文件拆成多個(gè)小文檔進(jìn)行存儲(chǔ)。
????????MongoDB其他特點(diǎn)如下:
????????1、技術(shù)成熟,相關(guān)工具和文檔支持較好,支持Java、C、C++、PHP等多種語(yǔ)言。
????????2、可以創(chuàng)建數(shù)據(jù)鏡像,擴(kuò)展性強(qiáng)。
????????3、在高負(fù)載的情況下,可以通過(guò)分片技術(shù)增加節(jié)點(diǎn)保證服務(wù)器性能,支持分布式集群。
????????4、每個(gè)數(shù)據(jù)庫(kù)都分成一個(gè)主數(shù)據(jù)庫(kù)和兩個(gè)從數(shù)據(jù)庫(kù),安全性高。
????????5、支持完全的索引:?jiǎn)捂I索引、多鍵索引、數(shù)組索引、全文索引、地理位置索引。
????????6、性能高且穩(wěn)定。
????????7、每個(gè)文檔可以創(chuàng)建多個(gè)鍵值對(duì),利于排序,業(yè)務(wù)開(kāi)發(fā)更方便。

對(duì)Java語(yǔ)言的支持

????????在 Java 程序中如果要使用 MongoDB,需要安裝了 Java 環(huán)境及 MongoDB JDBC驅(qū)動(dòng)。MongoDB JDBC驅(qū)動(dòng)的名稱叫做mongo-java-driver,只需要將該Jar包包含在classPath中或集成進(jìn)項(xiàng)目中即可。
mongo-java-driver中提供的API簡(jiǎn)單易懂,操作非常簡(jiǎn)單,具體示例代碼如下:
????????1、 創(chuàng)建數(shù)據(jù)庫(kù)示例代碼如下:

            try {  
            //連接到MongoDB服務(wù) 如果是遠(yuǎn)程連接可以替換“l(fā)ocalhost”為服務(wù)器所在IP地址  
            //ServerAddress()兩個(gè)參數(shù)分別為 服務(wù)器地址 和 端口  
            ServerAddress serverAddress = new ServerAddress("localhost",27017);  
            List<ServerAddress> addrs = new ArrayList<ServerAddress>();  
            addrs.add(serverAddress);  
              
            //MongoCredential.createScramSha1Credential()三個(gè)參數(shù)分別為 用戶名 數(shù)據(jù)庫(kù)名稱 密碼  
            MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray());  
            List<MongoCredential> credentials = new ArrayList<MongoCredential>();  
            credentials.add(credential);  
              
            //通過(guò)連接認(rèn)證獲取MongoDB連接  
            MongoClient mongoClient = new MongoClient(addrs,credentials);  
              
            //連接到數(shù)據(jù)庫(kù)  
            MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName");  
            System.out.println("Connect to database successfully");  
        } catch (Exception e) {  
            System.err.println( e.getClass().getName() + ": " + e.getMessage() );  
        }  

????????2、 創(chuàng)建集合示例代碼如下:
mongoDatabase.createCollection("test");

????????3、 插入文檔示例代碼如下:

         append("description", "database").  
         append("likes", 100).  
         append("by", "Fly");  
         List<Document> documents = new ArrayList<Document>();  
         documents.add(document);  
         collection.insertMany(documents);  
         System.out.println("文檔插入成功");  

????????4、 更新文檔示例代碼如下:

//更新文檔   將文檔中l(wèi)ikes=100的文檔修改為likes=200   
collection.updateMany(Filters.eq("likes", 100), new Document("$set",new Document("likes",200)));  

????????5、 刪除文檔示例代碼如下:

//刪除符合條件的第一個(gè)文檔  
         collection.deleteOne(Filters.eq("likes", 200));  
         //刪除所有符合條件的文檔  
         collection.deleteMany (Filters.eq("likes", 200));  

????????6、大文件存儲(chǔ)(超過(guò)16M),GridFS使用示例如下:

//獲取GridFS
GridFS gridFS = new GridFS(db, "fs");
//保存文件
File file = new File("c:\\testBig.zip");
GridFSInputFile gridFSFile = gridFS.createFile(file);
gridFSFile.save();
//查找文件
BasicDBObject query = new BasicDBObject();
query.put("filename", fileName);
GridFSDBFile gridFSOne = gridFS.findOne(query);

????????MongoDB數(shù)據(jù)庫(kù)中大文件(超過(guò)16M)存儲(chǔ)情況如下:


1.png

????????左側(cè)集合中有兩項(xiàng),一個(gè)是fs.files,一個(gè)是fs.chunks。其中fs.files中存儲(chǔ)文件的基本信息和此次記錄的唯一ID,如上圖所示。fs.chunks集合中分塊存儲(chǔ)實(shí)際的文件,每一塊中都包含一個(gè)遞增的序號(hào)和在fs.files對(duì)應(yīng)的記錄ID,如下圖:


2.png

性能分析

????????MongoDB的性能非常強(qiáng)勁和穩(wěn)定,廣受使用者的好評(píng)。根據(jù)MongoDB官網(wǎng)測(cè)試報(bào)告,最新版本的MongoDB3.0在性能表現(xiàn)上更是比以前提升了一大截。
????????1、并發(fā)量
????????在YCSB測(cè)試中,MongoDB3.0在100%寫(xiě)操作的情況下,可達(dá)225000 ops/sec;在95%讀操作、5%寫(xiě)操作的情況下,可達(dá)300000 ops/sec;在50%讀、50%寫(xiě)的情況下,可達(dá)150000 ops/sec。
????????2、響應(yīng)延遲
????????在性能測(cè)試中僅僅監(jiān)測(cè)并發(fā)量是不夠的,我們還要考慮操作的響應(yīng)延遲 。在讀操作響應(yīng)延遲上,MongoDB3.0穩(wěn)定的保持在1ms甚至更小的數(shù)值內(nèi);在平衡(讀寫(xiě)各50%)的工作負(fù)荷下,MongoDB3.0也能穩(wěn)定的保持在1ms左右。
????????YCSB測(cè)試配置如下:3千萬(wàn)的文檔和3千萬(wàn)的操作;文檔包含一個(gè)100字節(jié)的字段(總共151字節(jié))。
????????服務(wù)器都是具有下列規(guī)格的Softlayer 裸機(jī):
????????1、CPU: 2x Deca Core Xeon 2690 V2 – 3.00GHz (Ivy Bridge) – 2 x 25MB cache;
????????2、 RAM: 128 GB Registered DDR3 1333;
????????3、 Storage: 2x 960GB SSD drives, SATA Disk Controller;
????????4、 Network: 10 Gbps;
????????5、 Ubuntu 14.10 (64 bit);
????????6、 MongoDB Versions: MongoDB 2.6.7; MongoDB 3.0.1
????????詳細(xì)測(cè)試報(bào)告見(jiàn):https://www.mongodb.com/blog/post/performance-testing-mongodb-30-part-1-throughput-improvements-measured-ycsb

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容