Memcached против Memcache против Jcache

Пожалуйста, не отмечайте этот вопрос как дубликат. Прочитал предыдущие вопросы, но так и не понял.

В настоящее время я занимаюсь проектом, разработанным на Java, который использует MongoDB для сохранения. Но из-за некоторых проблем с производительностью меня просят использовать Memcached. Но я не могу понять, как Memcached может помочь мне в этом.

Во время серфинга я еще больше запутался из-за сервисов кэширования, таких как Memcache и Memcached. Может кто-нибудь объяснить мне, чем они отличаются и почему PHP отвечает на некоторые вопросы, когда задают Memcached.

Прошу всех дать четкие ответы и привести пример того, как я могу использовать Memcached в своем проекте. Что такое Memcache, Memcached, Jcache и SpyMemcached?

Если возможно, предоставьте ссылку на полный пример Memcached где-нибудь.


person Java Manz    schedule 26.08.2014    source источник


Ответы (1)


Memcache и Memcached — это одно и то же, «правильное имя» — Memcached ( http://memcached.org/ ).

JCache — это название стандартного Java API (JSR 107 — https://jcp.org/en/jsr/detail?id=107 ), который предоставляет общий API для взаимодействия со слоем/решениями кэширования. (получить/установить/удалить данные из кэша ключей/значений для упрощения)

Итак, вы действительно хотите использовать уровень кэширования в верхней части MongoDB в своем Java-приложении, вам необходимо:

  1. Установите Memcached где-нибудь в своей инфраструктуре (если он еще не установлен, вы можете быстро протестировать его с помощью telnet. Порт по умолчанию — 11211, поэтому вы можете запустить telnet localhost 11211, чтобы проверить, работает ли он.

  2. Вы должны использовать реализацию JCache для Memcached, например эту: https://github.com/toelen/spymemcached-jcache Это позволит вам хранить и получать данные в процесс Memcached, работающий где-то в вашей инфраструктуре.

    Поскольку вы говорите о JCache, вы используете Java, также можно использовать кеш на основе Java, который будет работать в вашей JVM напрямую, без стороннего кеша/процесса (memcached). Вы можете найти многие из них, это может быть, например, eHCache, JBoss Cache, и большинство из них предоставляют свой API с помощью стандартного API JCache.

  3. Теперь вам нужно закодировать свой уровень доступа к данным, чтобы получить данные из MongoDB и поместить их в кэш с помощью JCache API. В этом коде вам нужно будет проверить, находятся ли данные в кеше, если нет, запросить данные из MongoDB, установить их в кеш и использовать. Будьте осторожны со стратегией выселения.

В этом документе об использовании JCache в документации Google App Engine интересно увидеть «псевдокод» https://developers.google.com/appengine/docs/java/memcache/usingjcache (ваш код будет другим, но он должен помочь вам увидеть, что вы должны делать в своем коде).

Причина, по которой вы часто видите Memcached и PHP вместе, заключается в том, что Memcached является наиболее распространенным уровнем кэширования для приложений PHP, и многие API/FWK используют его. В Java у нас есть много вариантов, от чистого слоя Java до Memcached или другого...

Тем не менее, это «общий» подход, но перед этим я бы проверил, «почему» вы говорите, что MongoDB работает медленно, и решил проблему.

person Tug Grall    schedule 26.08.2014
comment
Спасибо @Tug за ответ. Теперь мне это совершенно ясно. Вы задокументировали все сомнения по этому поводу... Это здорово. Спасибо еще раз. Я говорю, что MongoDB работает медленно, потому что в настоящее время в нашем приложении мы обращаемся к БД несколько раз, даже если мы знаем, что данные в базе данных не изменились. Неправильно говорить, что Mongo медленный. Моя реализация неверна. Я предполагаю, что если я использую механизм кэширования, это будет очень быстро. - person Java Manz; 26.08.2014
comment
Итак, в целом, вы имеете в виду, что Memcached — это концепция, и реализации JCache, такие как SpyMemCached, могут помочь мне реализовать эту концепцию. Я прав? - person Java Manz; 26.08.2014
comment
Хм, не совсем. Кэширование - это концепция: вы можете хранить данные в ОЗУ рядом с вашим приложением, чтобы избежать вызова уровня сохранения. Memcached — это реализация кеша (и даже больше, так как это еще и протокол). JCache — это клиентский API для кешей, любого кеша. SpyMemcahed — это Java-клиент Memcached, основанный на протоколе Memcached, а spymemcached-jcache — это реализация JCache для протокола Memcached (фактически оболочка библиотеки spymemached). В принципе, поскольку JCache является стандартным API, вы можете использовать любой слой кэширования под прикрытием. - person Tug Grall; 26.08.2014
comment
По другой теме, поэтому, если вы знаете, что ваша реализация неверна, может быть, лучше сначала исправить это... Добавление слоя кэширования наверняка сделает приложение очень быстрым, но вам придется иметь дело с новым набором из вопросов: валидность/невалидность данных в кеше. Как долго вы можете хранить их в кеше, кто отвечает за удаление данных из него, что происходит, когда вы обновляете дату и т. д. и т. д. Кэширование — это не серебряная пуля, у него есть свои собственные проблемы, с которыми нужно иметь дело. - person Tug Grall; 26.08.2014
comment
Спасибо @Tug за предложение. Я обязательно посмотрю на это. Ваш ответ был действительно полезен. - person Java Manz; 27.08.2014