Memcache 与 Java 内存
Posted
技术标签:
【中文标题】Memcache 与 Java 内存【英文标题】:Memcache vs Java Memory 【发布时间】:2011-07-24 20:34:27 【问题描述】:简单,可能是愚蠢的问题:假设我有一个 Java 服务器,它在内存中存储我可以查询的常用键和值(比如说在 HashMap 中)
这与使用 Memcache(甚至 Redis)有什么区别?它们都将事物存储在内存中。对其中一个有好处吗? Memcache 是否会减少内存占用?可以在更少的内存中存储更多吗?查询速度更快?没区别?
【问题讨论】:
【参考方案1】:Java 内存相对于 memcache 的优势:
-
Java 内存更快(无网络)。
Java 内存不需要序列化,您可以使用 Java 对象。
memcache 相对于 Java 内存的优势:
-
它可以被多个应用服务器访问,因此您的缓存将在所有应用服务器之间共享。
它可以被各种不同的服务器访问,只要它们都同意密钥方案和序列化。
它将丢弃过期的缓存值,因此您会获得基于时间的失效。
【讨论】:
同样使用大量的 Java 内存会使垃圾收集器花费更长的时间,因此即使你有 RAM,你也可以拥有一个 Java 进程是有限制的。 memcache 没有垃圾收集器,它会随着更多实时数据项而变慢。 可以在 Java 内存实现中实现基于时间的失效,所以我不认为 memcached 优于 Java 内存;与特定的内存实现相比,memcached 更具优势。 @MaxNanasy 是的,您始终可以实现与 Java 内存一起使用的 LRU 缓存之类的东西。【参考方案2】:这取决于你想要什么。内存映射会更快;数据过期不是真正的问题(参见:Google Guava 的 MapMaker,它可以创建一个在读取和/或写入后使条目过期的映射,我们不要忘记像 OSCache 和 EHCache 这样的东西,更不用说分布式GigaSpaces XAP 或 Coherence 之类的东西。
缓存项目(XAP、OSCache、EhCache、Coherence 等)可以分发缓存条目,因此您可以获得自然分片和其他便利; Coherence 可以管理事务和直写,XAP 实际上被设计成一个记录系统(对它的写入是同步和复制的,这样您就可以使用内存中的数据网格作为实际的数据存储机制,而不是使用数据库。)
Memcached 是……好吧,您可以从一系列机器访问一个 memcached 服务器实例。作为 API 的 Memcached 只是一个键/值存储,分发完全在客户端完成。我猜它肯定有基础知识,而且肯定有多种语言 API,但除此之外它真的很蹩脚。
(顺便说一句,GigaSpaces 有一个 Memcached 层,因此您可以理论上使用 memcached 作为记录系统...)
【讨论】:
我基本上想要的是内存中的键值映射,它将使键过期以及在内存不足时删除键。我打算使用 Java 来操作这张地图。 Memcached 听起来非常适合这个目的。问题是我想创建一个 JAR,我打算将它分发给其他客户。其他人可能没有 memcached,或者可能不想安装 memcached。所以我想要 memcached 的功能,而无需安装其他任何东西。我追求的是 Java 版本的 memcached。 听起来你想要一个简单的缓存,而不是 memcached - memcached 是一个用于连接到 external 服务器的 API,所以如果你说的是内存,memcached 不是不是你的目标。 抱歉重复评论 - 编辑无效。老实说,我会做的是创建一个自定义缓存,并带有一个监控系统资源的后台线程。如果资源不足,则使最旧的条目过期;此外,如果条目超过了到期时间,它们也会到期。这很容易做到,并且可以完全满足您的要求。 谢谢。但这听起来像是不平凡的工作。这就是我被 memcached 吸引的原因 =) 我做了一些研究,发现了 QuickCached,它看起来像是 memcached 的实现。 @Hisoka:Google Guava 的 MapMaker 提供了软键(如果内存不足将被删除)和基于时间的过期,超级简单。【参考方案3】:我刚刚在并发哈希映射、memcached 和 mysql 之间做了一个基准测试。
结果如下:
键入插入查找删除
ConcurrentHashMap 264ms 93ms 82ms
Memcached 6549ms 5976ms 4900ms
Mysql 55754ms 26002ms 57899ms
此基准测试使用了一个线程池。
更多信息可以在这里找到: http://www.incentergy.de/2013/12/big-data-architecture-patterns-for-performance/
此外,以下缓存可能是 memcached 的替代方案: https://code.google.com/p/kitty-cache/
【讨论】:
因为有人问我这里有一个代码库:github.com/ManuelB/key-value-benchmark以上是关于Memcache 与 Java 内存的主要内容,如果未能解决你的问题,请参考以下文章
20210704 JAVA Redis和Memcached的一些区别
20210704 JAVA Redis和Memcached的一些区别
20210704 JAVA Redis和Memcached的一些区别