文档章节

GridFS实现原理

蜀山下的鱼
 蜀山下的鱼
发布于 2015/04/29 00:44
字数 704
阅读 46
收藏 1

参考文章:http://www.open-open.com/lib/view/open1330171884015.html


GridFS实现原理

GridFS在数据库中,默认使用fs.chunksfs.files来存储文件。

其中fs.files集合存放文件的信息,fs.chunks存放文件数据。

一个fs.files集合中的一条记录内容如下,即一个file的信息如下:

?
{
"_id": ObjectId("4f4608844f9b855c6c35e298"),       //唯一id,可以是用户自定义的类型
"filename": "CPU.txt",      //文件名
"length": 778,      //文件长度
"chunkSize": 262144,    //chunk的大小
"uploadDate": ISODate("2012-02-23T09:36:04.593Z"), //上传时间
"md5": "e2c789b036cfb3b848ae39a24e795ca6",      //文件的md5值
"contentType": "text/plain"    //文件的MIME类型
"meta": null   //文件的其它信息,默认是没有”meta”这个key,用户可以自己定义为任意BSON对象
}


对应的fs.chunks中的chunk如下:

?
{
"_id": ObjectId("4f4608844f9b855c6c35e299"),    //chunk的id
"files_id": ObjectId("4f4608844f9b855c6c35e298"),  //文件的id,对应fs.files中的对象,相当于fs.files集合的外键
"n": 0,     //文件的第几个chunk块,如果文件大于chunksize的话,会被分割成多个chunk块
"data": BinData(0,"QGV...")     //文件的二进制数据,这里省略了具体内容
}


默认chunk的大小是256K

public static final int DEFAULT_CHUNKSIZE = 256 * 1024;

所以在把文件存入到GridFS过程中,如果文件大于chunksize,则把文件分割成多个chunk,再把这些chunk保存到fs.chunks中,最后再把文件信息存入到fs.files中。

在读取文件的时候,先据查询的条件,在fs.files中找到一个合适的记录,得到“_id”的值,再据这个值到fs.chunks中查找所有“files_id”为“_id”的chunk,并按“n”排序,最后依次读取chunk中“data”对象的内容,还原成原来的文件。

自定义Gridfshash函数

尽管从理论上,无论用什么hash函数,都有可能出现hash值相同,但内容不相同的文件,但是对于GridFS默认使用的md5算法,目前已出现长度和md5值都相同但内容不一样的文件。

如果想要自已改用其它hash算法,可以从驱动入手。因为GridFSMongoDB中实际也只是两个普通的集合,所以完全可以自已修改驱动,替换下hash算法即可。

目前java版的驱动比较简单,可以很容易修改实现。

但是要注意,这样不符合GridFS的规范了。

注意事项

1. GridFS不自动处理md5相同的文件,对于md5相同的文件,如果想在GridFS中只有一个存储,要用户自已处理。Md5值的计算由客户端完成。

2. 因为GridFS在上传文件过程中是先把文件数据保存到fs.chunks,最后再把文件信息保存到fs.files中,所以如果在上传文件过程中失败,有可能在fs.chunks中出现垃圾数据。这些垃圾数据可以定期清理掉。


本文转载自:http://blog.csdn.net/caiwenfeng_for_23/article/details/44230493

蜀山下的鱼
粉丝 9
博文 405
码字总数 0
作品 0
广州
高级程序员
私信 提问
GridFS - NGinx详细分析(二)

GridFS简介 GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。 http://www.mongodb.org/display/DOCS/GridFS http://www.mongodb.org/display/DOCS/GridFS+Specification GridFS使......

一枚Sir
2014/06/19
0
0
浅尝辄止MongoDB:GridFS

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/82894835 一、为什么使用GridFS GridFS是MongoDB的一个子模块,使用GridFS可以基于M...

wzy0623
2018/09/29
0
0
基于GridFS+NGinx构建分布式文件系统 之实战(三)

基于GridFS构建分布式文件系统 首先看看什么是GridFS: GridFS is a mechanism for storing large binary files in MongoDB. There are several reasons why you might consider using GridF......

一枚Sir
2014/06/20
0
1
Java MongoDB : Save image example

Java MongoDB : Save image example In this tutorial, we show you how to save an image file into MongoDB, via GridFS API. The GridFS APIs are able to serve other binary files as w......

引鸩怼孑
2015/05/22
0
0
mongoDB--GridFS简介

前言 :GridFS从名字来看,就明白是一个文件系统,它是mongodb的一个子模块,使用GridFS可以基于mongodb来持久存储文件.并且支持分布式应用(文件分布存储和读取). 使用场景:如果你的系统有如下情...

索隆
2013/04/15
0
1

没有更多内容

加载失败,请刷新页面

加载更多

中国地理位置四至点及计算方法

中国地理位置四至点(China's geographical position is four o'clock),是指中国领土最东、西、南、北的四个地理位置。处于太平洋西岸,亚洲东部。 中文名 中国地理位置四至点 外文名 Chin...

boonya
14分钟前
0
0
8.eclipse 安装 lombook插件

1.效果 2.安装过程 参考: https://blog.csdn.net/zflovecf/article/details/80178679 2.1 下载插件 https://projectlombok.org/download.html 并放入eclipse所在目录 (位置参考下图) 2.2 ......

20190513
15分钟前
0
0
java io的编码和解码

public class copyFIle { public static void main(String[] args) throws UnsupportedEncodingException { String str="中国人民";//编码byte data[]=str.getBytes("gbk");//解码Sys......

南桥北木
29分钟前
0
0
SpringBoot中使用Filter

1.在传统web项目中添加filter <filter> <filter-name>TestFilter</filter-name> <!--定义filter名称 和filter类 --> <filter-class>com.jiafeng.filter.TestFilter</filter-class>......

贾峰uk
29分钟前
1
0
?为什么要学这个技术(有什么优秀的地方,可以解决哪些问题?

今天来总结一下Struts2的知识点,学习编程我的思路一般是这样的:     ① why ?为什么要学这个技术(有什么优秀的地方,可以解决哪些问题?)。     ②what ? 这个技术是什么玩意?有...

SEOwhywhy
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部