@kedavr13

Сохранение в память данных из таблицы с периодическим обновлением?

Есть данные которые я получаю из внешнего сервиса в свою структуру. Грубо говоря массив доступных языков. Как я могу сохранить их в память и обновлять например 1 раз в час? Просто мне они нужны довольно часто и постоянно кидать запрос на внешний сервис не хотелось бы. Данные обновляются очень редко поэтому думаю что такой подход будет подходящим для меня. Хотел использовать пакет sync но не разобрался что то с этими lock unlock не совсем понятно как они работают и как мне их использовать. Ссылка на пример в качестве ответа подойдет но если кто то разжует вообще будет великолепно=)
  • Вопрос задан
  • 124 просмотра
Решения вопроса 2
@12rbah
Можно написать метод у структуры, который раз в час дергает сервис и в этот момент обновляет структуру, в момент обновления повесить мьютекс
Ответ написан
@darst
https://pkg.go.dev/time@go1.21.0#Tick

Вот, что нужно, только в горутине запустить и промежуток тика поставить time.Hour. И в цикле делать запрос до внешнего сервиса и сохранение результата в map или в slice
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Да без вопросов.
Создайте табличку в БД и раз в 1 час запускайте вытягивание в нее данных.
Это может быть MySql может быть Redis, а можете тупо хранить в памяти.
Ответ написан
Кэширование как раз делается для экономии обращения к более дорогим/медленным ресурсам. Устанавливается срок действия ключа, по необходимости. Самые главные преимущества - независимость от хранения при перезагрузке программы (при крахе или просто выпуске новой версии) и масштабируемость архитектуры. В случае Redis весь список можно держать в одном ключе. Можно, запуская (под)программу в планировщике задач ежечасно, просто в цикле получить структуру, сериализовать в виде JSON, XML, Msgpack и записать байты как элемент списка в Redis.
Затем, при получении нужного списка просто проверяешь есть ли данные по ключу и если есть, распаковываешь в свои структуры данных в памяти и используешь в логике программы.
А мьютексы и локи вообще не нужны для этих целей.

Добавлено
Использовать СУБД - тоже нормальный вариант и не надо стесняться его использовать. Тем более, не нужно добавлять дополнительные единицы хранения типа Redis.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы