MongoDB簡介
????????MongoDB是一個開源的面向文檔存儲的NoSQL數(shù)據(jù)庫,它沒有了表結(jié)構(gòu)的概念和數(shù)據(jù)結(jié)構(gòu)的限制厂置;一個數(shù)據(jù)庫包含多個集合菩掏,每個集合理論上包含無數(shù)個文檔,每個文檔就是一條記錄昵济;每個文檔的格式都是BSON格式智绸,BSON是一種類JSON的一種二進制形式的存儲格式,簡稱Binary JSON;文檔的最大存儲空間是16M访忿,當文件大小超過16M之后要使用MongoDB的GridFS瞧栗;GridFS適合大文件的存儲,本質(zhì)上是將大文件拆成多個小文檔進行存儲海铆。
????????MongoDB其他特點如下:
????????1迹恐、技術(shù)成熟,相關(guān)工具和文檔支持較好卧斟,支持Java殴边、C、C++珍语、PHP等多種語言找都。
????????2、可以創(chuàng)建數(shù)據(jù)鏡像廊酣,擴展性強。
????????3赏枚、在高負載的情況下亡驰,可以通過分片技術(shù)增加節(jié)點保證服務(wù)器性能,支持分布式集群饿幅。
????????4凡辱、每個數(shù)據(jù)庫都分成一個主數(shù)據(jù)庫和兩個從數(shù)據(jù)庫,安全性高栗恩。
????????5透乾、支持完全的索引:單鍵索引、多鍵索引、數(shù)組索引乳乌、全文索引捧韵、地理位置索引。
????????6汉操、性能高且穩(wěn)定再来。
????????7、每個文檔可以創(chuàng)建多個鍵值對磷瘤,利于排序芒篷,業(yè)務(wù)開發(fā)更方便。
對Java語言的支持
????????在 Java 程序中如果要使用 MongoDB采缚,需要安裝了 Java 環(huán)境及 MongoDB JDBC驅(qū)動针炉。MongoDB JDBC驅(qū)動的名稱叫做mongo-java-driver,只需要將該Jar包包含在classPath中或集成進項目中即可。
mongo-java-driver中提供的API簡單易懂扳抽,操作非常簡單篡帕,具體示例代碼如下:
????????1、 創(chuàng)建數(shù)據(jù)庫示例代碼如下:
try {
//連接到MongoDB服務(wù) 如果是遠程連接可以替換“l(fā)ocalhost”為服務(wù)器所在IP地址
//ServerAddress()兩個參數(shù)分別為 服務(wù)器地址 和 端口
ServerAddress serverAddress = new ServerAddress("localhost",27017);
List<ServerAddress> addrs = new ArrayList<ServerAddress>();
addrs.add(serverAddress);
//MongoCredential.createScramSha1Credential()三個參數(shù)分別為 用戶名 數(shù)據(jù)庫名稱 密碼
MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray());
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
credentials.add(credential);
//通過連接認證獲取MongoDB連接
MongoClient mongoClient = new MongoClient(addrs,credentials);
//連接到數(shù)據(jù)庫
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贮尉、 刪除文檔示例代碼如下:
//刪除符合條件的第一個文檔
collection.deleteOne(Filters.eq("likes", 200));
//刪除所有符合條件的文檔
collection.deleteMany (Filters.eq("likes", 200));
????????6拌滋、大文件存儲(超過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ù)庫中大文件(超過16M)存儲情況如下:
????????左側(cè)集合中有兩項猜谚,一個是fs.files,一個是fs.chunks败砂。其中fs.files中存儲文件的基本信息和此次記錄的唯一ID,如上圖所示魏铅。fs.chunks集合中分塊存儲實際的文件昌犹,每一塊中都包含一個遞增的序號和在fs.files對應(yīng)的記錄ID,如下圖:
性能分析
????????MongoDB的性能非常強勁和穩(wěn)定览芳,廣受使用者的好評斜姥。根據(jù)MongoDB官網(wǎng)測試報告,最新版本的MongoDB3.0在性能表現(xiàn)上更是比以前提升了一大截沧竟。
????????1铸敏、并發(fā)量
????????在YCSB測試中,MongoDB3.0在100%寫操作的情況下悟泵,可達225000 ops/sec杈笔;在95%讀操作、5%寫操作的情況下糕非,可達300000 ops/sec蒙具;在50%讀球榆、50%寫的情況下,可達150000 ops/sec禁筏。
????????2持钉、響應(yīng)延遲
????????在性能測試中僅僅監(jiān)測并發(fā)量是不夠的,我們還要考慮操作的響應(yīng)延遲 融师。在讀操作響應(yīng)延遲上右钾,MongoDB3.0穩(wěn)定的保持在1ms甚至更小的數(shù)值內(nèi);在平衡(讀寫各50%)的工作負荷下旱爆,MongoDB3.0也能穩(wěn)定的保持在1ms左右舀射。
????????YCSB測試配置如下:3千萬的文檔和3千萬的操作;文檔包含一個100字節(jié)的字段(總共151字節(jié))怀伦。
????????服務(wù)器都是具有下列規(guī)格的Softlayer 裸機:
????????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
????????詳細測試報告見:https://www.mongodb.com/blog/post/performance-testing-mongodb-30-part-1-throughput-improvements-measured-ycsb