我正在寻找一个理想的(性能有效且可维护的)存储二进制数据的地方.在我的情况下,这些是图像.我必须做一些图像处理,缩放图像并存储在一个合适的位置,可以通过RESTful服务进行访问.
从我的研究到目前为止,我有几个选择,如:
NoSql解决方案,如MongoDB,GridFS
将文件存储在目录层次结构中的文件系统中,然后使用Web服务器通过URL访问图像
Apache Jackrabbit文档存储库
存储在缓存中,如Memcache,Squid Proxy
你想选择哪一个以及为什么会有用的想法或有更好的方法吗?
刚开始使用GridFS完全按照您的描述进行操作.
根据我迄今为止的经验,GridFS的主要优点是它不需要单独的文件存储系统.我们的整个持久层已经放入Mongo,因此下一个合乎逻辑的步骤是将文件系统存储在那里.平面命名空间只是摇滚,允许您使用丰富的查询语言根据要附加到它们的任何元数据来获取文件.在我们的应用程序中,我们使用了一个嵌入所有所有权信息的'appdata'对象,确保
NoSQL文件存储,尤其是GridFS,需要考虑的另一件事是它将与其他数据一起进行分片和扩展.如果您已将整个数据库键值存储放在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等)的驱动程序都有同源性.