Memcache与Java内存的比较

60

简单而又可能有些愚蠢的问题:假设我有一个Java服务器,在内存中存储常用的键和值,我可以查询它们(比如在HashMap中)

那么这与使用Memcache(甚至是Redis)有什么区别呢?它们都将东西存储在内存中。它们之间有什么优势吗?Memcache占用的内存更少吗?可以在更少的内存中存储更多的内容吗?查询速度更快吗?没有任何区别吗?

3个回答

57

Java内存相对于Memcache的优势:

  1. Java内存更快(没有网络延迟)。
  2. Java内存不需要序列化,您可以直接使用Java对象。

Memcache相对于Java内存的优势:

  1. 它可以被多个应用服务器访问,因此您的缓存将在所有应用服务器之间共享。
  2. 只要它们都同意键方案和序列化方式,它就可以被各种不同的服务器访问。
  3. 它会丢弃过期的缓存值,因此您可以基于时间进行失效处理。

7
当使用大量Java内存时,垃圾回收器会变得更加耗时,因此即使你有足够的RAM,Java进程也存在限制。而Memcache没有垃圾回收器,因此随着活跃数据项的增加不会导致速度变慢。 - Ian Ringrose
7
可以在Java内存实现中实施基于时间的失效,因此我不认为memcached相比Java内存具有优势;这更是memcached相比特定内存实现的优势。 - Max Nanasy
@MaxNanasy 是的,你可以随时实现类似于LRU缓存的东西,它可以与Java内存一起工作。 - Swapnil

32

1
因为有人问我,这里是一个包含代码的存储库:https://github.com/ManuelB/key-value-benchmark - Manuel_B

16
这取决于你想要什么。内存映射表会更快;数据过期并不是一个问题(参见:Google Guava的MapMaker,它可以创建一个在读取和/或写入后过期条目的映射表,还有像OSCacheEHCache这样的东西,更不用说像GigaSpaces XAPCoherence这样的分布式系统)。缓存项目(XAP、OSCache、EhCache、Coherence等)可以分发缓存条目,因此您可以获得自然的分片和其他设施;Coherence可以管理事务和写入,而XAP实际上被设计为作为记录系统(在其中写入会得到同步和复制,这样您就使用了内存中的数据网格作为实际的数据存储机制,而不是使用数据库。)Memcached是...好吧,您可以从一系列机器访问memcached服务器实例。 Memcached作为API只是一个键/值存储,分布完全是在客户端完成的。我想它肯定有基础功能,并且肯定有多种语言的API,但除此之外它真的很弱。 (顺便说一句,GigaSpaces有一个Memcached层,所以您理论上可以将memcached用作记录系统...)

我想要的基本上是一个内存中的键值映射,它可以在过期时删除键以及在内存不足时删除键。我计划使用Java来操作这个映射。Memcached听起来非常适合这个目的。问题是我想创建一个JAR文件,我计划将其分发给其他客户端。其他人可能没有安装memcached,或者可能不想安装memcached。因此,我希望具有memcached功能,而无需安装任何其他内容。我需要的是Java版本的memcached。 - Henley
听起来你想要一个简单的缓存,而不是memcached - memcached是用于连接到外部服务器的API,因此如果你谈论的是内存中的缓存,那么memcached不是你的目标。 - Joseph Ottinger
抱歉出现了双重评论 - 编辑没有生效。说实话,我会创建一个自定义缓存,并使用后台线程监视系统资源。如果资源不足,则过期最旧的条目;此外,如果它们已过期,则过期条目。这很容易做到,并且有满足您要求的好处。 - Joseph Ottinger
“nod” 很好。我认为需要大约十分钟的专注编码才能编写出这样的地图,但这可能比使用预先编写的产品所需的时间更长。 - Joseph Ottinger
2
@Hisoka:Google Guava的MapMaker提供了软引用(如果内存不足将被删除)和基于时间的过期,非常容易使用。 - user359996
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接