MongoDB GridFS最佳应用概述
《MongoDB GridFS最佳应用概述》
作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs
GridFS是MongoDB数据库之上的一个简单文件系统抽象。如果你熟悉Amazon S3的话,那么GridFS与之相似。为什么像MongoDB这样的NoSQL数据库会提供这样的一个文件层抽象呢?
一、使用GridFS的理由
理由如下:
1)存储用户产生的文件内容 大多数Web应用都允许用户上传文件。当用户使用关系数据库时,这些用户产生的文件会存储在文件系统中,与数据库相隔离,而不是放在数据库内。这就带来了一些问题。如何将文件复制到所有需要文件的服务器上?当文件删除后,怎样删除所有的拷贝?怎样保障文件的安全以及做灾备呢?GridFS很好地解决了这些问题,你可以利用你的数据库备份来备份你的文件。而且由于MongoDB自身的复制技术,在MongoDB集群中的每一个副本处都有你的文件拷贝。删除文件跟删除数据库中的对象一样简单。
2)访问文件内容的分区 当把文件上传到GridFS后,文件会被分割成大小为256KB的块,并单独存放。因此当你需要读文件中的某个范围的字节时,只需把相应的文件块载入内存,而无需把整个文件加载到内存。这一点对于选择读或编辑尺寸很大的媒体内容文件时非常有用。
3)在MongoDB中存储16MB以上的文件 MongoDB默认的文件大小上限为16MB。所以,如果你的文件超过了16MB,那么你就应该使用GridFS。
4)克服文件系统的限制 如果你需要存储大量的文件,你就需要考虑文件系统自身的限制,因为文件系统对目录下的文件数量是有要求的。而使用GridFS后,你无需再担心这个问题。GridFS和MongoDB的分片使得你的文件可以分布到多个服务器上,而且没有增加操作的复杂性。
二、深入GridFS
GridFS使用了两种集合Collection来存储数据
- > show collections;
- fs.chunks
- fs.files
- system.indexes
- >
> show collections;
fs.chunks
fs.files
system.indexes
>
fs.files集合包含了文件的元数据,而fs.chunks集合则存储实际的以256KB尺寸进行分割的文件块。如果你有分片的集合,那么文件块会分布到多台服务器上,或许能获得比文件系统更好的性能。
- > db.fs.files.findOne();
- {
- "_id" : ObjectId("530cf1bf96038f5cb6df5f39"),
- "filename" : "./conn.log",
- "chunkSize" : 262144,
- "uploadDate" : ISODate("2014-02-25T19:40:47.321Z"),
- "md5" : "6515e95f8bb161f6435b130a0e587ccd",
- "length" : 1644981
- }
- >
> db.fs.files.findOne();
{
"_id" : ObjectId("530cf1bf96038f5cb6df5f39"),
"filename" : "./conn.log",
"chunkSize" : 262144,
"uploadDate" : ISODate("2014-02-25T19:40:47.321Z"),
"md5" : "6515e95f8bb161f6435b130a0e587ccd",
"length" : 1644981
}
>
MongoDB还在files_id和文件块数中创建了复合索引,以帮助快速访问这些文件块
- > db.fs.chunks.getIndexes();
- [
- {
- "v" : 1,
- "key" : {
- "_id" : 1
- },
- "ns" : "files.fs.chunks",
- "name" : "_id_"
- },
- {
- "v" : 1,
- "key" : {
- "files_id" : 1,
- "n" : 1
- },
- "ns" : "files.fs.chunks",
- "name" : "files_id_1_n_1"
- }
- ]
- >
> db.fs.chunks.getIndexes();
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "files.fs.chunks",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"files_id" : 1,
"n" : 1
},
"ns" : "files.fs.chunks",
"name" : "files_id_1_n_1"
}
]
>
三、GridFS实例
MongoDB有一个内建的工具mongofiles,可以帮助练习实际使用GridFS的场景。请参阅相关的Driver文档,查看如何使用GridFS。
- Put
- #mongofiles -h -u -p --db files put /conn.log
- connected to: 127.0.0.1
- added file: { _id: ObjectId('530cf1009710ca8fd47d7d5d'), filename: "./conn.log", chunkSize: 262144, uploadDate: new Date(1393357057021), md5: "6515e95f8bb161f6435b130a0e587ccd", length: 1644981 }
- done!
- Get
- #mongofiles -h -u -p --db files get /conn.log
- connected to: 127.0.0.1
- done write to: ./conn.log
- List
- # mongofiles -h -u -p list
- connected to: 127.0.0.1
- /conn.log 1644981
- Delete
- [root@ip-10-198-25-43 tmp]# mongofiles -h -u -p --db files delete /conn.log
- connected to: 127.0.0.1
- done!
Put
#mongofiles -h -u -p --db files put /conn.log
connected to: 127.0.0.1
added file: { _id: ObjectId('530cf1009710ca8fd47d7d5d'), filename: "./conn.log", chunkSize: 262144, uploadDate: new Date(1393357057021), md5: "6515e95f8bb161f6435b130a0e587ccd", length: 1644981 }
done! Get
#mongofiles -h -u -p --db files get /conn.log
connected to: 127.0.0.1
done write to: ./conn.log List
# mongofiles -h -u -p list
connected to: 127.0.0.1
/conn.log 1644981 Delete
[root@ip-10-198-25-43 tmp]# mongofiles -h -u -p --db files delete /conn.log
connected to: 127.0.0.1
done!
四、GridFS的模块
如果你想把存储在MongoDB的GridFS的文件直接服务于Web服务器或文件系统,那么你可以使用下面的GridFS插件: 1)GridFS-Fuse:让GridFS的文件直接服务于文件系统 2)GridFS-Nginx:让GridFS的文件直接服务于Nginx
五、GridFS的局限性
GridFS也并非十全十美的,它也有一些局限性: 1)工作集 伴随数据库内容的GridFS文件会显著地搅动MongoDB的内存工作集。如果你不想让GridFS的文件影响到你的内存工作集,那么可以把GridFS的文件存储到不同的MongoDB服务器上。 2)性能 文件服务性能会慢于从Web服务器或文件系统中提供本地文件服务的性能。但是这个性能的损失换来的是管理上的优势。 3)原子更新 GridFS没有提供对文件的原子更新方式。如果你需要满足这种需求,那么你需要维护文件的多个版本,并选择正确的版本。
http://blog.csdn.net/chszs/article/details/20123327
MongoDB GridFS最佳应用概述的更多相关文章
- CentOS6.3搭建Nginx代理访问MongoDB GridFS图片资源
PHP可以直接读取MongoDB GridFS中的图片并显示到页面中,但对PHP的压力就大了.偶然机会,了解到Nginx可以代理访问,实现过程如下: 1.工具准备 安装一些必要的编译工具及库,这里是直 ...
- MongoDB的学习和使用(MongoDB GridFS)
MongoDB GridFS GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片.音频.视频等). GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中 ...
- MongoDB GridFS 存储大文件
我们经常会遇到这样的场景:上传/下载文件. 有两种思路可以解决这个问题: (1)将文件存储在服务器的文件系统中: (2)将文件存储在数据库中. 如果我们选择(2),那么我们可以使用MongoDB Gr ...
- MongoDB GridFS 存储文件
使用MongoDB的GridFS方式. CSDN: https://blog.csdn.net/qq_32657967/article/details/81534259官方文档: https://do ...
- MongoDb GridFS的使用
MongoDb GridFS 是MongoDB的文件存储方案,主要用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片.音频等),对大文件有着更好的性能. 要在C#中使用GridFS,首先 ...
- mongodb gridfs基本使用
Mongodb GridFS图片文件存储解决方案 之前解决方案是接收图片数据后,将图片直接存储到盘阵,然后通过Apache做服务器,将图片信息存储到数据库,并且存储一个Apache的访问路径. 目前需 ...
- MongoDB GridFS——本质上是将一个文件分割为大小为256KB的chunks 每个chunk里会放md5标识 取文件的时候会将这些chunks合并为一个整体返回
MongoDB GridFS GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片.音频.视频等). GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中 ...
- Spring Boot使用MongoDB GridFS进行文件的操作
1. GridFS简介 GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片.音频.视频等),但是它是存储在MonoDB的集合中. GridFS 会将文件对象分割成多个的ch ...
- MongoDB开发最佳实践
MongoDB开发最佳实践 连接到MongoDB · 关于驱动程序:总是选择与所用之MongoDB相兼容的驱动程序.这可以很容易地从驱动兼容对照表中查到: · 如果使用第三方框架(如Spring Da ...
随机推荐
- GMT-CMSP系统维护步骤整理
一.关闭前端各服务1.北京代理,韩国代理节点nginx/etc/init.d/nginx stop2.关闭WEB1,WEB2 NGINX和PHPpkill nginx && pkill ...
- [51nod1357]密码锁 暨 GDOI2018d1t2
有一个密码锁,其有N位,每一位可以是一个0~9的数字,开启密码锁需要将锁上每一位数字转到解锁密码一致.这个类似你旅行用的行李箱上的密码锁,密码锁的每一位其实是一个圆形转盘,上面依次标了0,1,...9 ...
- Oracle下的ArcSDE创建的空间数据库的备份与恢复
对Oracle下ArcSDE创建的空间数据库, 整体备份.恢复或迁移. 一.imp和exp命令方式 1.1 数据库完整备份 检查数据库字符集是否一致 SQL>select userenv(‘la ...
- 19个三维GIS软件对比
19个三维GIS软件对比 麦豆科研技术中心 days ago 我国GIS经过三十多年的发展,理论和技术日趋成熟,在传统二维GIS已不能满足应用需求的情况下,三维GIS应运而生,并成为GIS的重要发展方 ...
- pymongo常见的高级用法
pymongo是python中基于mongodb数据库开发出来的,比mongoengine要高级一些,也要好用一些. 基本的增删查改就不说了 insert() delete() find() upda ...
- centos7 将服务添加到systemctl
centos7中提供了systemd服务,可以方便的管理各种服务 但是有些通过编译安装的服务systemd里面没有,我们只需要添加一下服务文件即可 以下用nginx作为例子,展示如何添加服务到syst ...
- http://blog.csdn.net/a9529lty/article/details/6454156
http://blog.csdn.net/a9529lty/article/details/6454156
- [Python爬虫] 之十一:Selenium +phantomjs抓取活动行中会议活动信息
一.介绍 本例子用Selenium +phantomjs爬取活动行(http://www.huodongxing.com/search?qs=数字&city=全国&pi=1)的资讯信息 ...
- 《深入理解Java虚拟机》笔记6
class文件由无符号数和表两种类型数据构成.表其实相当于一种结构体,内部又嵌套无符号数或者表. 用u1,u2,u4,u8分别代表一个字节,两个字节,四个字节,八个字节的无符号数. 如图中所示,cla ...
- Java 程序员快速上手 Kotlin 11招
收录待用,修改转载已取得腾讯云授权 作者 | 霍丙乾 编辑 | 迷鹿 前言 最近经常会收到一些 "用 Kotlin 怎么写" 的问题,作为有经验的程序员,我们已经掌握了一门或者多门 ...