Memcache与Java内存

Hen*_*hiu 51 memory memcached caching redis

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

它与使用Memcache(甚至是Redis)有什么区别?它们都将东西存储在内存中.一个或另一个有益处吗?Memcache是​​否减少了内存占用?可以在更少的内存中存储更多?更快查询?没有不同?

Ned*_*der 51

Java内存优于memcache的优点:

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

memcache优于Java内存的优点:

  1. 它可以由多个应用程序服务器访问,因此您的缓存将在所有应用程序服务器之间共享.
  2. 它可以被各种不同的服务器访问,只要它们都对密钥方案和序列化达成一致.
  3. 它将丢弃过期的缓存值,因此您将获得基于时间的失效.

  • 还使用大量的Java内存使得垃圾colector需要更长的时间,所以到说你可以,即使你有RAM中的java程序的限制.memcache没有垃圾收集器,使用更多的实时数据项会变慢. (7认同)
  • 可以在Java内存实现中实现基于时间的失效,因此我不认为它是memcached优于Java内存的优势; 它更像是memcached优于特定内存实现的优势. (6认同)

Man*_*l_B 27

我刚刚在并发哈希映射,memcached和MySQL之间做了一个基准测试.

HashMap与memcached对比MySQL

结果如下:

键入Insert Lookup Remove

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/


Jos*_*ger 16

这取决于你想要什么.内存中的地图会更快; 数据到期并不是真正的问题(参见:Google Guava的MapMaker,它可以创建一个在读取和/或写入后使条目过期的地图,让我们不要忘记像OSCacheEHCache这样的东西,更不用说像GigaSpaces XAPCoherence这样的分布式内容).

缓存项目(XAP,OSCache,EhCache,Coherence等)可以分发缓存条目,因此您可以获得自然的分片和其他设施; Coherence可以管理事务和直写,XAP实际上设计用作记录系统(写入它的同步和复制,这样你就可以使用内存数据网格作为实际的数据存储机制而不是使用数据库.)

Memcached是......好吧,你可以从一系列机器上访问一个memcached服务器实例.Memcached作为API只是一个键/值存储,并且分发完全在客户端完成.我猜,它肯定有了基础知识,而且肯定有多种语言API,但它确实非常柔软.

(顺便说一句,GigaSpaces有一个Memcached层,所以你理论上可以使用memcached作为记录系统...)

  • @Hisoka:Google Guava的MapMaker提供软键(如果内存不足将被删除)和基于时间的过期,非常容易. (2认同)