Локальное хранение статических данных

#java #json #spring

#java #json #весна

Вопрос:

В настоящее время у меня есть 200 строк key -> value, values, где один ключ имеет два значения. Хотя я использую только первое значение.

Мне интересно, как с этим справиться: использовать ли файл json для хранения всех этих данных и преобразовать его в map<String, List> или я мог бы создать класс enum для хранения всего этого?

Я просто не уверен, как это решить

Ответ №1:

поскольку в нем всего 200 записей, у вас есть много вариантов.

1. Просто сохраните его в Hashmap.

Плюсы:

  • Самый простой, насколько это возможно. O (1) поиск

Минусы:

  • Если у вас есть несколько потоков, изменяющих это, вы напрашиваетесь на неприятности

  • Порядок не будет сохранен

  • Нет предоставления TTL

2. Сохраните его в LinkedHashMap

То же, что и Hashmap, за исключением того, что порядок будет сохранен

3. Сохраните его в ConcurrentHashMap

То же, что и Hashmap, за исключением того, что его можно использовать, даже если несколько потоков пытаются его изменить

4. Сохраните его в CaffeineCache

Вы можете установить TTL

5. Сохраните его в EHCache

Вы можете установить TTL. Предоставление для хранения в основной оперативной памяти. Обеспечение переполнения на диск

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

Поскольку это поиск по ключу-значению, вы можете использовать static блок или @PostConstruct аннотированные методы или конструктор для его заполнения при запуске приложения. Или, если вы находитесь в среде spring-boot, вы можете использовать @Configuration аннотированный класс и @Value аннотированную переменную-член Map<String,Object> в сочетании с файлом свойств / yaml, в котором у вас есть все данные, и ввести их

Относительно 2 значений

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

 class Values {
 Value left;
 Value right;
}
  

в конце концов, это не список, а строго типизированная языковая программа

Комментарии:

1. Вы не думаете, что было бы безумием иметь карту с 200 значениями, lol? И мне пришлось бы жестко кодировать инициализацию, верно? Кроме того, не нужно беспокоиться о параллелизме или порядке или о чем-либо из этого. Вы не думаете, что было бы лучше иметь это в перечислении?

2. Как вы это сделаете в enum? Я не могу придумать, как это сделать с помощью enum, если у вас есть пример кода, вставьте его сюда, пожалуйста. Нет, я не думаю, что 200 записей — это безумие, но если вас это беспокоит, загрузите его из файла свойств. Или загрузите его из других служб конфигурации, таких как consul / eureka / etcd / zookeeper, или загрузите из базы данных.

3. О, разве ты не можешь? Я просто предположил, что вы могли бы это сделать. Как бы вы это сделали с файлом свойств? Вам нужен класс модели для его загрузки?

4. @Spider, да, вам нужен класс модели. Если вы используете spring boot, он автоматически введет для вас, если ваш класс аннотирован, @Configuration а карта переменных-членов аннотирована @Value

Ответ №2:

Предполагая, что данные должны сохраняться.

MapDB пригодится для подобных требований в java. Это можно использовать для хранения любого сериализуемого типа.

Карта может быть сохранена непосредственно в файле и извлечена. Он имеет встроенную поддержку транзакций.

 import org.mapdb.DB;
import org.mapdb.DBMaker;

private DB mapDb;
    private ConcurrentMap<String, LinkedHashSet> translationMap;

    @PostConstruct
    private void init() {
        log.info("Map db Start initiated...");

        mapDb = DBMaker
                .fileDB(new File(nosqlDbPath))
                .fileMmapEnable()
                .transactionEnable()
                .make();

        translationMap = (ConcurrentMap<String, LinkedHashSet>) mapDb.hashMap("map").createOrOpen();
        log.info("Map db Start completed.");
    }


    @PreDestroy
    private void close() {
        log.info("Map db shutdown initiated...");
        mapDb.commit();
        mapDb.close();
        log.info("Map db shutdown complete.");

    }
  

translationMap будет содержать все данные при запуске.

Не забудьте добавить банки MapDB