我正在寻找一个理想的(性能有效且可维护的)存储二进制数据的地方。就我而言,这些是图像。我必须进行一些图像处理、缩放图像并存储在可以通过 RESTful 服务访问的合适位置。
根据我目前的研究,我有几个选择,例如:
- MongoDB、GridFS等NoSql解决方案
- 将文件存储在目录层次结构中的文件系统中,然后使用 Web 服务器通过 url 访问图像
- Apache Jackrabbit 文档存储库
- 存储在缓存中,例如 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/