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

标签 java mongodb memcached squid jackrabbit

我正在寻找一个理想的(性能有效且可维护的)存储二进制数据的地方。就我而言,这些是图像。我必须进行一些图像处理、缩放图像并存储在可以通过 RESTful 服务访问的合适位置。

根据我目前的研究,我有几个选择,例如:

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

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

最佳答案

刚刚开始使用 GridFS 来完成您所描述的操作。

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

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

由于二进制数据本身被分割成 block ,它会让人感觉有点“黑匣子”,这种前景让那些习惯于基于经典目录的文件系统的人感到害怕。这在 RockMongo 等管理程序的帮助下得到缓解。

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

祝你好运!

编辑:

为了给你一个使用 GridFS 上传简单文件的例子,这里是 Python 库 PyMongo 中最简单的方法。

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 等)的驱动程序都有同源。

关于java - 存储可以通过调用 url 呈现的二进制数据的理想位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8358004/

相关文章:

node.js - 在 Node.js 中使用 findAndModify 时出错

javascript - MongoDB mapReduce 每分钟文档计数由附加类别字段分隔

spring - 使用 memcached 和 spring boot 为不同对象自定义过期日期

django - 如何在 Django 中使用缓存? (最好在GAE中)

hibernate - NHibernate 和 Memcached - 应该启用 use_minimal_puts 吗?

java - 让用户将自定义字段添加到对象 "class"

java - 是否可以将 JFrame 放在前面而不是焦点?

java - XMLEventWriter 从头开始​​ : how do I emit xmlns attribute?

java - 根据输入字符串决定 var 类型

node.js - 使用 Mongoose 从文档中删除数组元素