Memcache vs Java内存
简单,可能是愚蠢的问题:假设我有一个Java服务器,它在内存中存储常用的键和值,我可以查询(比如说在一个HashMap中)
这和使用Memcache(甚至Redis)有什么区别? 他们都把东西存储在内存中。 是否有一个好处? Memcache会减less内存占用量吗? 可以存储更less的内存? 更快地查询? 没有不同?
Java内存优于memcache的优点:
- Java内存更快(无networking)。
- Java内存不需要序列化,你可以使用Java对象。
memcache比Java内存的优点:
- 它可以被多个应用程序服务器访问,所以你的caching将在所有的应用程序服务器之间共享。
- 它可以被各种不同的服务器访问,只要他们都同意关键scheme和序列化。
- 它会放弃过期的caching值,所以你得到基于时间的无效。
我只是在并发哈希映射,memcached和MySQL之间做了一个基准testing。
结果如下:
键入插入查找删除
ConcurrentHashMap 264ms 93ms 82ms
Memcached 6549ms 5976ms 4900ms
Mysql 55754ms 26002ms 57899ms
一个线程池被用于这个基准。
一些更多的信息可以在这里find: http : //www.incentergy.de/2013/12/big-data-architecture-patterns-for-performance/
此外,以下caching可能是memcached的替代方法: https : //code.google.com/p/kitty-cache/
这取决于你想要的东西。 内存映射将会更快; 数据到期并不是真正的问题(请参阅:谷歌Guava的MapMaker ,它可以创build一个地图,在读取和/或写入后到期的条目,我们不要忘记像OSCache和EHCache的东西,更不用说像GigaSpaces XAP或Coherence )。
caching项目(XAP,OSCache,EhCache,Coherence等)可以分配caching条目,因此您可以获得自然的分片和其他设施; Coherence可以pipe理事务和直写,而XAP实际上被devise为一个logging系统(写入它的同步和复制,这样你就可以使用内存中的数据网格作为实际的数据存储机制,而不是使用数据库。)
Memcached是…好吧,您可以从一系列机器访问一个memcached服务器实例。 作为API的Memcached只是一个键/值存储,分配完全在客户端完成。 我猜,它肯定有基础,而且它肯定有多种语言的API,但是它真的很蹩脚。
(顺便说一句,GigaSpaces有一个Memcached层,所以理论上可以使用memcached作为logging系统…)
基本上,如果我们有一些应用服务器,似乎我们必须使用Memcached。