Я использую redigo в приложении, и мне интересно, как мои службы должны взаимодействовать с Redis.
Вот что говорит Википедия о потокобезопасности:
Потокобезопасность — это концепция компьютерного программирования, применимая к многопоточному коду. Поточно-ориентированный код только манипулирует общими структурами данных таким образом, чтобы все потоки вели себя правильно и выполняли свои проектные спецификации без непреднамеренного взаимодействия.
Я интерпретирую это так, что если к структуре данных необходимо получить доступ несколькими клиентами (сотнями, тысячами, если не миллионами в современном мире микросервисов), потокобезопасность — это способ, с помощью которого мы обеспечиваем правильное сохранение состояния в системе независимо от того, какой клиент получает доступ к данным и когда. Это означает определение приоритета доступа (какой клиент получил доступ первым), обеспечение блокировки при изменении (только один клиент может писать одновременно) и одновременное продвижение параллелизма (многие клиенты могут читать данные, если нет изменений).
Из того, что я понял, клиент redigo может использоваться несколькими «горутинами» (или потоками) одновременно. Это наводит меня на мысль, что одноэлементной реализации, с которой я знаком в Java, должно быть достаточно.
Я вижу примеры, например, здесь и здесь, где соединения Redis (pool
s) просто создаются методом main
и передаются различным функциям redigo. Это не кажется самым надежным способом добиться цели, хотя они, похоже, следуют одноэлементному шаблону. (Понятно, что второй пост на самом деле просто быстрый и грязный API.)
Я бы сделал это так:
В функции
main
вызовитеinit
, которая возвращает redigopool
.Создайте функции-обработчики (контроллеры), которые принимают
pool
в качестве параметра (своего рода "грязная" инъекция зависимостей).
Это (я думаю) гарантирует, что когда-либо будет создан только один pool
.
В качестве альтернативы, есть ли причина, по которой я не могу создавать pool
(клиент) каждый раз, когда хочу получить доступ к хранилищу данных? Если клиент убит после завершения транзакции, есть ли проблема с запуском нового pool
каждый раз, когда обработчик получает запрос?