Ищите кэш для чтения в памяти - PullRequest
0 голосов
/ 25 февраля 2012

Я ищу кэш в памяти со следующим поведением:

  • При первом доступе или после инициализации он считывает все данные, которые должны быть кэшированы одновременно.Например, все строки таблицы.
  • Через один час полный кэш очищается и все данные считываются снова.
  • Кэш может быть очищен по требованию.

Я знаю, как реализовать такой кеш, но кто-нибудь знает существующую библиотеку, которая обеспечивает кеш вроде этого.

Это моя идея об интерфейсе.Есть элементы для кеша

Element element = new Element(Object key, Object objectToCache);

Загрузчик предоставляет все элементы

Collection<Element> elements = myLoader.getElements();

В конце концов есть кеш

public Cache {
  public Cache(CacheLoader loader, int timeToReload) {
    ...
  }

  public Object getValueForKey(Object key {
    ...
  }

  ...
}

Решениебудет иметь кэш с одной записью, которая является HashMap реальных записей.С помощью этого решения я могу использовать существующие кэши, такие как Ehcache или Guava Cache .

Но, тем не менее, я ищу существующий код, прежде чем начать писать собственную библиотеку.

Ответы [ 5 ]

2 голосов
/ 01 марта 2012

Вы ищете какой-то распределенный кеш и хотите распределить начальную нагрузку по многим экземплярам, ​​верно?

API постоянного хранилища данных Hazlecast всегда стоит посмотреть.

Hazlecast Doc

Инициализация при запуске Начиная с версии 1.9.3 MapLoader имеет новый API MapLoader.loadAllKeys.Он используется для предварительного заполнения карты в памяти при первом касании / использовании карты.Если MapLoader.loadAllKeys возвращает NULL, то ничего не будет загружено.Ваша реализация MapLoader.loadAllKeys может возвращать все или некоторые ключи.Например, вы можете выбрать и вернуть только горячие клавиши.Также обратите внимание, что это самый быстрый способ предварительного заполнения карты, поскольку Hazelcast оптимизирует процесс загрузки, поскольку каждый узел загружает собственную часть записей.

В сочетании с hazelcast.initial.minСвойство конфигурации .cluster.size позволяет распределить исходную нагрузку.

1 голос
/ 25 февраля 2012

Я не уверен, какая коллекция вам нужна (Карта, Набор, Список или Очередь), но взгляните на Реализации Google Guava Cache

0 голосов
/ 29 февраля 2012

Я тоже не вижу, где это библиотека.Просто потому, что ваши требования очень особенные:

  • У вас такой маленький набор данных для кеширования или много памяти, что вы можете загрузить все сразу
  • Но вы хотите инициализировать 'Кэширование '(я бы скорее назвал это структурой данных в памяти) лениво, вероятно потому, что вы не хотите замедлять запуск приложения
  • И вы можете позволить кешу заполняться вечно

Я бы отбросил ленивое «требование» и просто использовал бы ExecutorService.newSingleThreadScheduledExecutor(ThreadFactory) с запланированным потоком демона, который перезагружает ConcurrentHashMap каждый час, начиная с запуска приложения (асинхронно).Это так просто, как может получиться.

Если вы хотите, чтобы это было более сложно, сделайте ваш метод get synchronized и проверьте наличие isInitialized или используйте двойную проверку блокировки или, или, или.Вы видите, где это происходит?Это крошечное требование, которое вы создали, заставляет вас стремиться к библиотеке, но из-за других требований я бы просто усомнился, что это вообще имеет какой-то смысл, и выбрал бы более простое решение.

0 голосов
/ 25 февраля 2012

Похоже, вам нужно переопределить HashMap.get () и добавить if, у которого есть таймер для сброса, и код, который загружается при необходимости.

Если вам не нужно больше, я бы не стал искать библиотеку для этого.Большинство кэшей в любом случае не заполняются полностью при первом доступе.

0 голосов
/ 25 февраля 2012

Эта функциональность, вероятно, очень проста для эффективного размещения в библиотеке. В конце концов, все сводится к тому, чтобы поток вызывал функцию реинитализации каждый час.

Getter:

if (collection == null) reinitialize();
return collection.get(key);

Очищающая нить:

while(true) {
  Thread.sleep(60*60);
  collection = null; // probably as a method.
}

Обратите внимание, что Я бы не назвал это "кэшированием" .

Стратегия, к которой вы обращаетесь, запускается по таймеру повторная инициализация . Кэширование обычно означает

  • отложенная загрузка только необходимых записей
  • LRU или возраст по истечении единичных записей
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...