【发布时间】:2011-07-24 20:34:27
【问题描述】:
简单,可能是愚蠢的问题:假设我有一个 Java 服务器,它在内存中存储我可以查询的常用键和值(比如说在 HashMap 中)
这与使用 Memcache(甚至 Redis)有什么区别?它们都将事物存储在内存中。对其中一个有好处吗? Memcache 是否会减少内存占用?可以在更少的内存中存储更多吗?查询速度更快?没区别?
【问题讨论】:
标签: caching memory memcached redis
简单,可能是愚蠢的问题:假设我有一个 Java 服务器,它在内存中存储我可以查询的常用键和值(比如说在 HashMap 中)
这与使用 Memcache(甚至 Redis)有什么区别?它们都将事物存储在内存中。对其中一个有好处吗? Memcache 是否会减少内存占用?可以在更少的内存中存储更多吗?查询速度更快?没区别?
【问题讨论】:
标签: caching memory memcached redis
Java 内存相对于 memcache 的优势:
memcache 相对于 Java 内存的优势:
【讨论】:
这取决于你想要什么。内存映射会更快;数据过期不是真正的问题(参见:Google Guava 的 MapMaker,它可以创建一个在读取和/或写入后使条目过期的映射,我们不要忘记像 OSCache 和 EHCache 这样的东西,更不用说分布式GigaSpaces XAP 或 Coherence 之类的东西。
缓存项目(XAP、OSCache、EhCache、Coherence 等)可以分发缓存条目,因此您可以获得自然分片和其他便利; Coherence 可以管理事务和直写,XAP 实际上被设计成一个记录系统(对它的写入是同步和复制的,这样您就可以使用内存中的数据网格作为实际的数据存储机制,而不是使用数据库。)
Memcached 是……好吧,您可以从一系列机器访问一个 memcached 服务器实例。作为 API 的 Memcached 只是一个键/值存储,分发完全在客户端完成。我猜它肯定有基础知识,而且肯定有多种语言 API,但除此之外它真的很蹩脚。
(顺便说一句,GigaSpaces 有一个 Memcached 层,因此您可以理论上使用 memcached 作为记录系统...)
【讨论】:
我刚刚在并发哈希映射、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/
【讨论】: