2012-07-15 87 views
2

我有一个应用程序在Ubuntu Linux 12.04上运行需要存储和检索大量的大型序列化对象。目前,商店是通过简单地将序列化的流保存为文件来实现的,其中文件名等于序列化对象的md5散列。不过,我想加快将文件存储替换为内存中缓存最近读取/写入的对象的速度,并且最好为我做散列。memcached像磁盘持久化软件

我的应用程序的设计不应该更复杂。因此,最好是以抽象和有效的方式管理键值数据库和缓存的存储后端。我有点迷失在那里的所有关键/价值商店,而且很多主题/信息似乎已经过时。我最初正在寻找像memcached + membase这样的东西,但也许有更好的解决方案。我看着redis,mongodb,couchdb,但是我不清楚它们是否适合我的需求。

我最重要的要求:

  • 透明保存到持久性存储的方式,最近读/写的对象是可迅速通过在内存中缓存自动它们。
  • 存储应该在重新启动后存活。因此,在内存中,对象应尽快保存在磁盘上。
  • 目前我正在手动计算md5。如果后端为我做这件事,那实际上会更好。因此能够在存储对象时获取散列键,并且能够稍后使用散列键检索对象。
  • 更重要的是,如果有可用于Ubuntu 12.04的软件包,无论是在Universe中还是通过启动板或其他软件。
  • 除此之外,该软件最好是光不能超过必要的复杂(我不需要分布地图,减少就业机会等)

感谢您的咨询!

+0

应用程序是将这些本地存储到它运行的计算机,还是计划与服务器通信以存储这些对象?您列出的所有技术都是服务器位。要运行应用程序并在本地存储,除了应用程序之外,还需要在本地安装和运行服务器。 – 2012-07-15 19:24:02

+0

操作系统在文件上进行内存中缓存,所以这个系统没问题。 – 2012-07-15 23:14:04

回答

0

我想看看MongoDB。它使用您的操作系统高效地缓存事物,以便将数据分页和分页,而且安装起来非常简单。Redis和Memcached将不会是您的好解决方案,因为它们将所有内容都保存在RAM中。其他更简单的解决方案,如LevelDB或BDB也可能适用。我不认为任何数据库会自动为你计算散列值。听起来你已经有了这个代码。

1

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

Redis的一个缺点是,如果你存储了二进制对象的TON,你将被限制在RAM中的可用内存(除非分片),因此可能会达到性能限制。在这种情况下,您可以将对象存储在文件系统上,对它们进行散列,并将密钥存储在Redis中,并将其与存储在文件服务器上的文件名相匹配,您会没事的。

-

一种替代选择是将检查出ElasticSearch这就好比蒙戈在于它存储对象天然如JSON,但它包含与的RESTful API接口顶部Lucene搜索引擎。它“加热”内存中的数据以实现快速响应,但也是一个持久存储区,最好的部分是自动分片和自动群集使用多播来查找其他节点。

-

希望有所帮助,如果是这样,分享爱! ;-)

+0

对于ElasticSearch,顺便说一句,您需要将Java添加到您的堆栈。您可以为他们的网站上引用的ES构建RPM。 – 2012-07-15 12:24:57

+0

对象非常大,并且它们的集合将很快超出RAM。此外,商店应该在重新启动后生存Redis能够很好地将所有内容卸载到磁盘上,或者只是在内存中存储? – Jeroen 2012-07-15 12:39:46

+0

Redis使用快照或重做日志保留到磁盘,但不会卸载数据。他们必须适应记忆。请参阅http://redis.io/topics/persistence – 2012-07-15 18:06:17

相关问题