Java memcached的替代方案,可持久保存到磁盘

Java memcached的替代方案,可持久保存到磁盘,java,caching,persistence,memcached,distributed,Java,Caching,Persistence,Memcached,Distributed,我目前在java应用程序中使用memcached,总体来说,它工作得很好。 memcached对我来说最重要的功能是: 它的速度很快,因为读写都在内存中,不接触磁盘 它只是一个键/值存储(因为这就是我的应用程序所需的全部) 它是分布式的 它通过让每个对象恰好位于一台服务器上来高效地使用内存 它不假定对象来自数据库(因为我的对象不是数据库对象) 然而,有一件事我想做,memcached做不到。我希望定期(可能每天一次)将缓存内容保存到磁盘。我希望能够从保存的磁盘映像恢复缓存。 磁盘保存不

我目前在java应用程序中使用memcached,总体来说,它工作得很好。 memcached对我来说最重要的功能是:

  • 它的速度很快,因为读写都在内存中,不接触磁盘
  • 它只是一个键/值存储(因为这就是我的应用程序所需的全部)
  • 它是分布式的
  • 它通过让每个对象恰好位于一台服务器上来高效地使用内存
  • 它不假定对象来自数据库(因为我的对象不是数据库对象)
然而,有一件事我想做,memcached做不到。我希望定期(可能每天一次)将缓存内容保存到磁盘。我希望能够从保存的磁盘映像恢复缓存。 磁盘保存不需要非常复杂。如果在保存过程中添加了新的键/值,我不在乎它是否包含在保存中。如果在保存过程中修改了现有的键/值,则保存的值应该是旧值或新值,但我不在乎是哪一个。
有谁能推荐另一种缓存解决方案(无论是免费的还是商业的),它具有对我来说很重要的所有(或很大比例的)memcached功能,并且允许从磁盘保存和恢复整个缓存?

我从未尝试过,但是关于它呢?
它的主页上写着(引用):

Redis是一个键值数据库。它是 与memcached类似,但数据集 不是易变的,值可以是 字符串,就像在memcached中一样, 但也使用原子 推送/弹出元素的操作

为了非常快,但在 同时对整个数据集进行持久化 被记录在记忆中,不时地 时间和/或发生多个变化时 如果要执行数据集,则 在磁盘上异步写入。你 may丢失了最后几个查询 在许多应用中都可以接受,但是 与内存中的DB(Redis)一样快 支持非阻塞主从 复制以解决此问题 问题(由冗余引起)

它似乎回答了你提到的一些问题,所以对你来说可能会有帮助

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


作为旁注:如果您需要将所有这些内容写入磁盘,那么您可能并不真正需要一个缓存系统。。。毕竟,如果您将memcached用作缓存,那么您应该能够在必要时按需重新填充它——尽管如此,我承认,如果整个memcached集群同时崩溃,可能会出现一些性能问题

那么,也许一些“更”的面向关键/价值存储的软件可以帮助我们?比如说什么?
它可能不会像memcached那么快,因为数据不是存储在RAM中,而是存储在磁盘上,不过…

您看过了吗

  • 快速、嵌入式、进程内数据管理
  • 键/值存储,非关系型
  • 持久存储
  • 免费的,开源的
但是,它不符合您的标准之一:

  • BDB支持分布式复制,但数据没有分区。每个节点存储完整的数据集
看看

JCS是一个分布式缓存系统 用java编写。其目的是 通过提供 用于管理各种类型的缓存数据的方法 动态特性。像任何缓存一样 系统中,JCS最适用于高 读、低放应用程序。延迟 时间急剧下降,瓶颈不断 从数据库中移开 高效缓存系统。学习如何 开始使用JCS

JCS不仅仅是缓存 内存中的对象。它提供 许多附加功能:

* Memory management
* Disk overflow (and defragmentation)
* Thread pool controls
* Element grouping
* Minimal dependencies
* Quick nested categorical removal
* Data expiration (idle time and max life)
* Extensible framework
* Fully configurable runtime parameters
* Region data separation and configuration
* Fine grained element configuration options
* Remote synchronization
* Remote store recovery
* Non-blocking "zombie" (balking facade) pattern
* Lateral distribution of elements via HTTP, TCP, or UDP
* UDP Discovery of other caches
* Element event handling
* Remote server chaining (or clustering) and failover
* Custom event logging hooks
* Custom event queue injection
* Custom object serializer injection
* Key pattern matching retrieval
* Network efficient multi-key retrieval

我们正在使用。我认为除了定期将缓存保存到磁盘之外,它几乎满足了您的所有需求,但您应该能够创建两个缓存管理器(一个基于内存,一个基于hdd),并定期运行java cronjob,它将遍历所有内存缓存键/值对,并将它们放入hdd缓存。OSCache的优点在于它非常易于使用。

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

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

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

通过这种方式,我们可以从两个方面都获得最佳效果,而不必用任何新的东西来取代memcached。

怎么样?

您可以使用这一成熟的商业产品,满足您的需求和更多需求。它是最快的分布式内存数据网格(cache++),完全分布式,支持多种类型的持久化方法

盖伊·尼帕斯, GigaSpaces具有“磁盘持久化”模式
-----------------------------------------------------
|            |  go-memcached   | original memcached |
|            |      v1         |      v1.4.13       |
| workerMode ----------------------------------------
|            | Kqps | cpu time |  Kqps  | cpu time  |
|----------------------------------------------------
| GetMiss    | 648  |    17    |  468   |   33      |
| GetHit     | 195  |    16    |  180   |   17      |
| Set        | 204  |    14    |  182   |   25      |
| GetSetRand | 164  |    16    |  157   |   20      |
-----------------------------------------------------