前言 :GridFS從名字來看,就明白是一個文件系統,它是mongodb的一個子模塊,使用GridFS能夠基於mongodb來持久存儲文件.而且支持分佈式應用(文件分佈存儲和讀取).java
使用場景:若是你的系統有以下情景nginx
1) 有大量的上傳圖片(用戶上傳或者系統自己的文件發佈等)web
2) 文件的量級處於飛速增加,有可能打到單機操做系統本身的文件系統的查詢性能瓶頸,甚至超過單機硬盤的擴容範圍.mongodb
3) 文件的備份(不適用gridfs這種三方也能夠作,可是不盡方便),文件系統訪問的故障轉移和修復..分佈式
4) 文件的索引,存儲除文件自己之外還須要關聯更多的元數據信息(好比,不單單存儲文件,還要保存一些文件的發佈式做者/發佈時間/文件tag屬性等等自定義信息)而且須要索引的...工具
5) 基於4),對文件的分類模糊,若是採用操做系統的文件系統,文件夾分類關係混亂或者沒法分類時..性能
6) 當前系統是基於web的,對圖片的訪問根據url了規則路由的..(普通文件系統也能夠)url
7) 文件尺寸較小,並且衆多,且文件有可能被遷移/刪除等..操作系統
GridFS和其餘分佈式文件系統相比,並無什麼特殊的地方....若是有,那就是它和mongodb有一腿...code
GridFS是mongodb中用戶存儲大對象的工具,對於mongodb,BSON格式的數據(文檔)存儲有尺寸限制,最大爲16M.可是在實際系統開發中,常常會有上傳圖片或者文件的功能,這些文件可能尺寸會很大..咱們能夠借用Gridfs來輔助實現這些文件的管理.
GridFS會將大文件對象分割成多個小的chunk(文件片斷),通常爲256k/個,每一個chunk將做爲mongodb的一個文檔(document)被存儲在chunks集合中..gridfs模塊會爲每一個文件建立chunks和files信息.每一個文件的實際內容被存在chunks(二進制數據)中,和文件有關的meta數據(filename,content_type,還有用戶自定義的屬性)將會被存在files集合中.files集合中的文檔就是BSON格式,可使用mongodb的索引等等特性,固然能夠對files文檔作數據分析..
java中使用GridFS存儲文件的代碼樣例:
DB db = fsMongoDB.getDB("img");//Mongodb DB對象,將文件存放在哪一個DB中 GridFS gridFS = new GridFS(db,"s");//獲取一個gridFS的對象,同時指定collection GridFSInputFile file = gridFS.createFile(fileItem.getInputStream());//建立gridfs文件 file.setFilename(fileItem.getFileName());//指定惟一文件名稱 file.save();//保存
存儲的文件,能夠經過mongo的指令去查看..
對於GridFS文件的web訪問方式,你們能夠搜索一下Gridfs + nginx,既可獲取相應的信息..