эффективный способ кэширования около 8 миллионов записей в Java - PullRequest
0 голосов
/ 08 мая 2018

У меня есть веб-приложение на Java, я должен кэшировать около 8 миллионов записей, чтобы минимизировать количество запросов на соединение с базой данных (MySql). Каково будет эффективное решение этой проблемы?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Предполагается, что у вас нет проблем с памятью для хранения записей 80lac. Вы можете создать две карты. В первой карте (назовем это RECORDS) вы сохраняете все записи, используя механизм пары ключ-значение. Создайте вторую карту (назовем ее CACHED_RECORD). Реализуйте алгоритм MRU для хранения записей в CACHED_RECORD. Реализуйте логику записи таким образом:

  • Запись запроса из CACHED_MAP.
  • Если запись найдена, вернуть запись из CACHED_MAP.
  • Если запись отсутствует, получить запись из RECORDS и обновить запись в CACHED_RECORD, используя логику MRU.

Для логики MRU вы можете обратиться - https://en.wikipedia.org/wiki/Cache_replacement_policies

Другой подход заключается в индексации ваших записей на основе определенных правил / политик (например, имена людей, начинающиеся с A в определенном регионе).

Хотя хранить записи 80lac не очень хорошо. Вы должны также оценить производительность вашего приложения.

Надеюсь, это поможет:)

0 голосов
/ 08 мая 2018

Итак, лучшая простая практика - это получать записи и держать их на карте (например) и если карта не содержит никаких записей, получить его из БД. Это будет выглядеть как

private List<Records> cachedRecords;

public List<Record> getRecords()
{
   if (cachedRecords == null)
   cachedRecords = DB.getConnection().getRecords();
}

return cachedRecords;

Обновление: также вы можете использовать Hibernate, где существуют такие инструменты, как ленивая инициализация

...