可以持久保存到磁盘的 memcached 的替代方法

我目前正在将memcached与我的java应用程序一起使用,总的来说它运行良好。

memcached对我来说最重要的功能是:

  • 它很快,因为读取和写入都在内存中,并且不接触磁盘
  • 它只是一个键/值存储(因为这是我的应用程序需要的全部内容)
  • 它是分布式的
  • 它通过让每个对象只存在于一台服务器上来有效地使用内存
  • 它不假设对象来自数据库(因为我的对象不是数据库对象)

但是,有一件事我想做,memcached做不到。我想定期(也许每天一次)将缓存内容保存到磁盘。我希望能够从保存的磁盘映像恢复缓存。

磁盘保存不需要非常复杂。如果在保存过程中添加了新的键/值,我不在乎它是否包含在保存中。如果在保存过程中修改了现有的键/值,则保存的值应该是旧值或新值,但我不在乎哪一个。

任何人都可以推荐另一种缓存解决方案(免费或商业),该解决方案具有对我很重要的所有(或很大一部分)memcached功能,并且还允许从磁盘保存和恢复整个缓存的能力?


答案 1

我从来没有尝试过,但是redis呢?
其主页说(引用):

Redis 是一个键值数据库。它类似于 memcached,但数据集不是易失性的,值可以是字符串,就像在 memcached 中一样,但也可以是列表和集合,具有推送/弹出元素的原子操作。

为了非常快,但同时持久,整个数据集被保存在内存中,并且不时地和/或当对数据集进行大量更改时,它会异步写入磁盘。您可能会丢失在许多应用程序中可接受的最后几个查询,但它与内存数据库一样快(Redis支持非阻塞主从复制,以便通过冗余来解决此问题)。

它似乎回答了你谈到的一些观点,所以也许在你的情况下它可能会有所帮助?

如果你尝试一下,我对你发现的东西很感兴趣,顺便说一句;-)


作为旁注:如果您需要将所有这些写入磁盘,也许缓存系统并不是您真正需要的...毕竟,如果您使用memcached作为缓存,您应该能够在必要时按需重新填充它 - 但是,我承认,如果您整个memcached集群一次倒塌,可能会出现一些性能问题......

那么,也许一些“更多”键/值面向存储的软件可以提供帮助?例如,像CouchDB这样的东西?
它可能不会像memcached那样快,因为数据不存储在RAM中,而是存储在磁盘上,但是......


答案 2

也许你的问题就像我的问题一样:我只有几台用于memcached的机器,但内存很大。即使其中一个失败或需要重新启动,也会严重影响系统的性能。根据最初的memcached哲学,我应该添加更多的机器,每个机器的内存更少,但这并不划算,也不完全是“绿色IT”;)

对于我们的解决方案,我们为缓存系统构建了一个接口层,以便可以嵌套底层缓存系统的提供程序,就像您可以对流所做的那样,并为memcached编写了一个缓存提供程序以及我们自己的非常简单的Key-Value-2磁盘存储提供程序。然后,我们为缓存项目定义一个权重,该权重表示如果无法从缓存中检索项目,则重建项目的成本有多高。嵌套磁盘缓存仅用于权重高于特定阈值的项目,可能约占所有项目的 10%。

在缓存中存储对象时,我们不会浪费时间,因为保存到一个或两个缓存无论如何都会排队等待异步执行。因此,写入磁盘缓存不需要很快。读取也是如此:首先,我们采用memcached,只有当它不存在并且它是一个“昂贵”的对象时,我们才会检查磁盘缓存(它比memcached慢得多,但仍然比在一台机器出现故障后重新计算30 GB数据要好得多)。

通过这种方式,我们从两个世界中获得了最好的结果,而不会被任何新事物所取代。