【问题标题】:memcached like software with disk persistence具有磁盘持久性的类似 memcached 的软件
【发布时间】:2012-07-14 13:25:48
【问题描述】:

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

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

我最重要的要求:

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

感谢您的建议!

【问题讨论】:

  • 应用程序是否会将这些本地存储到它运行的机器上,或者您是否计划让它与服务器通信以存储这些对象?您列出的所有技术都是服务器位。要在本地运行应用程序和商店,除了应用程序之外,还需要在本地安装和运行服务器。
  • 操作系统对文件进行内存缓存,所以这个系统没问题。

标签: nosql memcached couchdb redis ehcache


【解决方案1】:

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

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

--

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

--

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

【讨论】:

  • 顺便说一下,对于 ElasticSearch,您需要将 Java 添加到您的堆栈中。您可以在他们的网站上引用为 ES 构建的 rpm。
  • 对象非常大,它们的集合很快就会超过 RAM。商店也应该在重新启动后幸存下来。 Redis 能很好地将所有内容卸载到磁盘上,还是只是内存存储?
  • Redis 使用快照或重做日志保存到磁盘,但它不会卸载数据。它们必须适合记忆。见redis.io/topics/persistence
  • 作为记录,在 redis 2.6 上使用一些 lua 脚本很可能会自动生成哈希密钥
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-03
    • 2010-11-21
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多