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