【问题标题】:Memcached vs Memcache vs JcacheMemcached vs Memcache vs Jcache
【发布时间】:2014-08-26 12:42:26
【问题描述】:

请不要将此问题标记为重复。看了前面的问题,还是没看懂。

我目前正在研究一个用 Java 设计的项目,该项目使用 MongoDB 进行持久性。但由于它的一些性能问题,我被要求使用 Memcached。但我无法弄清楚 Memcached 如何帮助我做到这一点。

在冲浪时,由于 Memcache 和 Memcached 等缓存服务,我变得更加困惑。有人可以解释一下这些有何不同以及为什么当问到 Memcached 时 PHP 会在某些问题中成为答案。

我要求大家清楚地回答,并通过一个例子告诉我如何在我的项目中使用 Memcached。什么是 Memcache、Memcached、Jcache 和 SpyMemcached?

如果可能,请在某处提供完成 Memcached 示例的链接。

【问题讨论】:

    标签: mongodb caching memcached spymemcached jcache


    【解决方案1】:

    Memcache 和 Memcached 是同一个东西,“正确的名称”是 Memcached (http://memcached.org/)。

    JCache 是标准 Java API (JSR 107 - https://jcp.org/en/jsr/detail?id=107) 的名称,它提供通用 API 以与缓存层/解决方案进行交互。 (从键/值缓存中获取/设置/删除数据以简化)

    所以你真的想在你的 Java 应用程序中使用 MongoDB 顶部的缓存层,你必须:

    1. 在您的基础架构上安装 Memcached(如果尚未安装,您可以使用 telnet 快速测试它。默认端口是 11211,因此您可以运行 telnet localhost 11211 以查看它是否正常工作。

    2. 您必须为 Memcached 使用 JCache 实现,例如这个:https://github.com/toelen/spymemcached-jcache 这将允许您将数据存储和获取到在您的基础架构中某处运行的 Memcached 进程。

      既然您在谈论 JCache,那么您就是在使用 Java,也可以使用基于 Java 的缓存,它可以直接在您的 JVM 中工作,而无需第三方缓存/进程 (memcached)。您可以找到其中的许多,例如 eHCache、JBoss Cache,并且它们中的大多数都使用标准的 JCache API 公开其 API。

    3. 现在您需要对数据访问层进行编码以从 MongoDB 中获取数据并使用 JCache API 将它们设置到缓存中。在此代码中,您必须检查数据是否在缓存中,如果没有则从 MongoDB 查询数据,并将其设置在缓存中并使用它。小心驱逐策略。

    有关在 Google App Engine 文档中使用 JCache 的文档很有趣,可以查看“伪代码”https://developers.google.com/appengine/docs/java/memcache/usingjcache(您的代码会有所不同,但它应该可以帮助您了解您必须在代码中做什么。)

    之所以经常看到 Memcached 和 PHP 在一起,是因为 Memcached 是 PHP 应用程序最常用的缓存层,有很多 API/FWK 都在使用它。在 Java 中,我们有很多选择,从纯 Java 层到 Memcached 或其他......

    但是,这是“整体”方法,但在此之前,我会检查“为什么”你说 MongoDB 很慢,并解决问题。

    【讨论】:

    • 感谢@Tug 的回答。我现在很清楚。你记录了所有的疑点……太好了。再次感谢。我说 MongoDB 很慢,因为在我们的应用程序中,即使我们知道数据库中的数据没有改变,目前我们也会多次访问数据库。说Mongo很慢是不正确的。我的实现是错误的。我假设如果我使用缓存机制,它会非常快。
    • 那么总的来说,你的意思是说Memcached是一个概念吗,像SpyMemCached这样的JCache实现可以帮我实现这个概念。我说的对吗?
    • 嗯,不完全是“缓存”这个概念:您可以将 RAM 中的数据靠近您的应用程序,以避免调用持久层。 Memcached 是缓存的一种实现(而且更多,因为它也是协议)。 JCache 是缓存的“客户端”API,“任何缓存”。 SpyMemcahed,是Memcached基于Memcached协议的Java客户端,而spymemcached-jcache是​​JCache对Memcached协议的“实现”(实际上是spymemached库的封装)。原则上,由于 JCache 是一个标准的 API,你可以使用任何隐藏的缓存层。
    • 关于另一个话题,所以如果你知道你的实现是错误的,可能最好先修复它......添加一个缓存层,肯定会使应用程序非常快,但是你将不得不处理一组新问题:缓存中数据的有效性/无效性。您可以将它们保留在缓存中多长时间,谁负责从中删除数据,更新日期时会发生什么等等等缓存不是灵丹妙药,它需要处理自己的问题。
    • 感谢@Tug 的建议。我一定会调查的。你的回答真的很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2017-07-15
    • 2013-07-16
    • 2019-09-12
    • 2021-03-23
    • 1970-01-01
    • 2010-11-14
    相关资源
    最近更新 更多