2

我有一个在 Ubuntu Linux 12.04 上运行的应用程序,它需要存储和检索大量大型序列化对象。目前,存储是通过简单地将序列化流保存为文件来实现的,其中文件名等于序列化对象的 md5 哈希。但是,我想加快将文件存储替换为对最近读/写的对象进行内存缓存的文件存储的速度,并且最好为我进行哈希处理。

我的应用程序的设计不应该变得更复杂。因此,最好是一个存储后端,它以抽象和有效的方式管理键值数据库和缓存。我对那里的所有键/值存储有点迷茫,而且许多主题/信息似乎已经过时了。我最初是在寻找类似 memcached+membase 的东西,但也许有更好的解决方案。我查看了 redis、mongodb、couchdb,但我不太清楚它们是否符合我的需求。

我最重要的要求:

  • 通过将最近写入/读取的对象自动缓存在内存中,可以快速获得最近写入/读取的对象,从而透明地保存到持久存储中。
  • 商店应该在重新启动后仍然存在。因此,内存中的对象应尽快保存在磁盘上。
  • 目前我正在手动计算 md5。如果后端为我这样做,实际上会更好。因此能够在存储对象时获取散列键,并能够在以后使用散列键检索对象。
  • 最大的优点是,如果有适用于 Ubuntu 12.04 的软件包,无论是在宇宙中还是通过启动板或其他方式。
  • 除此之外,该软件最好应该是轻量级的,而不是比必要的更复杂(我不需要分布式 map-reduce 作业等)

感谢您的任何建议!

4

2 回答 2

1

我通常会建议使用 Redis,因为它会快速且在内存中使用异步持久存储。另外,您会发现您可以将它们的不同数据类型用于其他目的,而不是像 memcached 那样单一用途。就自动散列而言,我认为它不会这样做,因为您在存储对象时定义自己的键(就像在大多数对象中一样)。

Redis 的一个缺点是,如果您要存储大量二进制对象,您将被限制为 RAM 中的可用内存(除非分片),因此可能会达到性能限制。在这种情况下,您可以将对象存储在文件系统上,对它们进行哈希处理,并将密钥存储在 Redis 中,并将其与存储在文件服务器上的文件名匹配,这样就可以了。

--

另一种选择是查看 ElasticSearch,它与 Mongo 类似,将本机对象存储为 JSON,但它在顶部包含 Lucene 搜索引擎和 RESTful API 接口。它“预热”内存中的数据以实现快速响应,但它也是一个持久存储,最好的部分是它使用多播自动分片和自动集群来查找其他节点。

--

希望对您有所帮助,如果有,请分享爱!;-)

于 2012-07-15T12:23:00.190 回答
0

我会看看MongoDB。它使用您的操作系统有效地缓存内容以将数据分页进出,并且设置起来非常简单。Redis 和 Memcached 对您来说不是很好的解决方案,因为它们将所有内容都保存在 RAM 中。其他更简单的解决方案,如 LevelDB 或 BDB 也可能是合适的。我认为任何数据库都不会为您自动计算哈希值。听起来你已经有了这个的代码。

于 2012-07-15T18:32:43.293 回答