Использование ehcache перед memcached - PullRequest
6 голосов
/ 24 марта 2011

У нас есть веб-приложение, которое загружает объект User из базы данных. Это приложение большого объема с тысячами одновременно работающих пользователей, поэтому мы ищем способы кэширования объектов User, чтобы минимизировать нагрузку на базу данных.

В настоящее время используется ehcache, но мы рассматриваем memcached, чтобы снизить требования к памяти приложения и сделать его более масштабируемым.

Проблема, с которой мы сейчас сталкиваемся при использовании memcached, заключается в загрузке процессора, которую приносит сериализация экземпляра User. Мы ищем способы ускорить сериализацию, но также рассматриваем вопрос о том, можем ли мы использовать меньший кэш ehcache, поддерживаемый сервером memcached.

Кто-нибудь имел опыт использования ehcache с поддержкой memcached (т. Е. Сначала посмотрите в ehcache, если пользователя нет, посмотрите в memcache, если нет там, посмотрите в базе данных)?

Есть ли недостатки такого подхода?

Ответы [ 6 ]

2 голосов
/ 24 марта 2011

Если вы готовы отойти от Ehcache, вы можете рассмотреть Infinispan , который теперь включает интеграцию с memcache .Работать немного сложнее, чем Ehcache, но не слишком.

Начиная с версии 4.1, дистрибутив Infinispan содержит серверный модуль, который реализует текстовый протокол memcached.Это позволяет клиентам memcached общаться с одним или несколькими поддерживаемыми Infinispan серверами memcached.Эти серверы могут работать автономно, точно так же, как memcached, где каждый сервер работает независимо и не взаимодействует с остальными, или они могут быть кластеризованы, где серверы реплицируют или распространяют свое содержимое на другие серверы Memcached с резервной копией Infinispan, таким образом предоставляя клиентам возможности отработки отказа.

1 голос
/ 02 июня 2011

Infinispan может хранить объекты как экземпляры и минимизировать издержки сериализации, а также вместо репликации данных на каждом узле он может распределять данные, чтобы лучше использовать вашу память, или вы можете ограничить количество записей, хранящихся в памяти.Вы также можете просто отправлять сообщения о недействительности другим узлам при обновлении значения, вместо того, чтобы отправлять сериализованные значения вокруг.Сериализация Java, и начиная с версии 5, вы можете подключить свои настраиваемые Externalizer, чтобы настроить проводной формат некоторых типов, чтобы дать ему дополнительный толчок (как правило, не требуется, но приятно иметь).в memcached и по другим причинам, имейте в виду, что Infinispan также «говорит» текстовый протокол memcached, поэтому, если у вас есть другие клиенты, вы можете интегрироваться с ним.

1 голос
/ 24 марта 2011

Имеет смысл делать то, что вы предлагаете. У нас возникла та же проблема с memcached, заключающаяся в том, что накладные расходы на сериализацию объектов туда и обратно не стоят того, чтобы использовать их отдельно для приложений большого объема. Наличие локального кэша уменьшает нагрузку на стороне приложения, в то время как memcached уменьшает нагрузку на сторону базы данных. Недостатком является дополнительная сложность написания двухуровневых кешей и поддержания согласованности кеша. Я постараюсь свести к минимуму, где вам нужно его использовать.

0 голосов
/ 15 апреля 2017

В этой статье описывается, как мы можем использовать внутрипроцессный кеш перед распределенным кешем в приложении Spring, определяя наши собственные MultiTieredCacheManager и MultiTieredCache:

Многоуровневое кэширование - использование внутрипроцессного кэша перед распределенным кэшем

0 голосов
/ 17 декабря 2013

Нельзя заменить DiskStore в ehcache, потому что он финальный.Вы можете реализовать новый OffHeapStore и подключить его вот так.Вот как работает BigMemory.Существует проект Apache, называемый DirectMemory, который делает то же самое.

Подробнее см. Мой пост здесь:

http://forums.terracotta.org/forums/posts/list/0/8833.page#40635

0 голосов
/ 30 августа 2011

Вы можете просто перезаписать net.sf.ehcache.Cache.createDiskStore()

new Cache(..) {
  protected Store createDiskStore() {
    if (isDiskStore()) {
      // default: return DiskStore.create(this, diskStorePath);
      MemcachedStore store = new MemcachedStore(..);
      getCacheConfiguration().addConfigurationListener(store);
      return store;
    } else {
      return null;
    }
  }
}

MemcachedStore - это пользовательская реализация net.sf.ehcache.store.Store, которую вам придется сделать самостоятельно.Это не тривиально, но опять же, начиная с DiskStore не должно быть слишком сложно.

...