存储可通过调用url呈现的二进制数据的理想位置



我正在寻找一个理想的(性能有效和可维护)的地方来存储二进制数据。在我的例子中,这些是图像。我必须做一些图像处理,缩放图像并将其存储在可以通过RESTful服务访问的合适位置。

从我的研究到目前为止,我有几个选择,如:

    NoSql解决方案如MongoDB,GridFS
  1. 在目录层次结构的文件系统中作为文件存储,然后使用web服务器通过url访问图像
  2. Apache Jackrabbit文档库
  3. 存储在缓存中,如Memcache,Squid Proxy

有没有想过你会选择哪一个,为什么会有用,或者有没有更好的方法?

刚刚开始使用GridFS做你所描述的。

从我目前的经验来看,GridFS的主要优点是它不需要单独的文件存储系统。我们的整个持久化层已经放到了Mongo中,所以下一个合乎逻辑的步骤就是将我们的文件系统也存储在那里。平面命名空间非常棒,它允许您使用丰富的查询语言根据您想要附加到文件上的任何元数据来获取文件。在我们的应用中,我们使用了一个'appdata'对象来嵌入所有的所有权信息,确保

使用NoSQL文件存储(尤其是GridFS)要考虑的另一件事是,它将与其他数据一起进行分片和扩展。如果您已经将整个DB键值存储在mongo服务器中,那么最终如果您必须用更多的机器扩展服务器集群,那么您的文件系统将随之增长。

它会让人感觉有点"黑盒",因为二进制数据本身被分割成块,这种前景会让那些习惯了传统的基于目录的文件系统的人感到害怕。在RockMongo等管理程序的帮助下,这种情况得到了缓解。

总而言之,在GridFS中存储图像就像插入文档一样简单,所有主要语言的大多数驱动程序都可以为您处理一切。在我们的环境中,我们在一个端点上上传图像,并使用PIL执行调整大小。然后在另一个端点从mongo获取图像,该端点只输出数据并将其模拟为jpeg。

祝你好运!

编辑:

为了给你一个用GridFS上传文件的例子,下面是PyMongo (python库)中最简单的方法。

from pymongo import Connection
import gridfs
binary_data = 'Hello, world!'
db = Connection().test_db
fs = gridfs.GridFS(db)
#the filename kwarg sets the filename in the mongo doc, but you can pass anything in
#and make custom key-values too.
file_id = fs.put(binary_data, filename='helloworld.txt',anykey="foo")
output = fs.get(file_id).read()
print output 
>>>Hello, world!

如果你喜欢的话,你也可以查询自定义值,如果你希望查询基于相对于你的应用程序的自定义信息,这是非常有用的。

try:
  file = fs.get_last_version({'anykey':'foo'})
  return file.read()
catch gridfs.errors.NoFile:
  return  None

这些只是一些简单的例子,许多其他语言(PHP, Ruby等)的驱动程序都有同源。

我会选择jackrabbit和它的REST框架sling结合使用http://sling.apache.org

Sling允许您通过REST调用或webday上传/下载文件,而底层jackrabbit存储库为您提供了一个高性能的存储,可以将文件存储在树结构中(如果您喜欢,也可以平坦)。

jackrabbit和sling都支持一个事件机制,你可以在上传后异步处理图像,即创建缩略图。

http://sling.apache.org/site/manipulating-content-the-slingpostservlet-servletspost.html上的手册描述了如何使用sling提供的REST接口操作数据。

将图像作为blob存储在RDBMS中的另一种选择,并且您立即获得关于完整性,安全性等的一些保证(如果在数据库上正确设置),存储额外的元数据,使用SQL等管理集合

最新更新