Потокобезопасный клиент redis

# #python #go #redis

Вопрос:

Я использую goredis, и, насколько я вижу, при подключении клиента к серверу redis существует пул соединений. Я не знаю, как запросить сервер redis и убедиться, что он работает в потокобезопасном режиме.

В настоящее время я делаю это:

Я создаю глобальный указатель client : client *goredis.Redis Затем я делаю это:

 go func () {
    http.HandleFunc("/send_data/", trackHandler)
    http.HandleFunc("/init/", initHandler)
    http.ListenAndServe(":8000", nil)
} ()
 

Итак, теперь я хочу использовать client in trackHandler и initHandler , но я обеспокоен тем, что при выполнении запросов никак не происходит синхронизации. Можно ли так все испортить? Каков канонический способ решения этой проблемы в голанге?

Также мне интересно, как это работает в redis-py. Я видел эту тему:

В общем, я предлагаю вам либо:

a. создайте глобальный экземпляр клиента redis и используйте его в своем коде. b. создайте глобальный пул соединений и передайте его различным экземплярам redis на протяжении всего кода.

Оба они достигают одного и того же. Оба они являются потокобезопасными.

Как это делается в первом сценарии?

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

1. какой клиент redis вы используете? github.com/xuyu/goredis ?

Ответ №1:

У клиента есть пул соединений, который является потокобезопасным, и всякий раз, когда вы выполняете команду, клиент пытается получить соединение из пула. Таким образом, даже несмотря на то, что у клиента нет блокировки, он по-прежнему потокобезопасен, поэтому вы должны быть в порядке с глобальным клиентом.

Смотрите здесь — как функция набора номера создает новый пул соединений: https://github.com/xuyu/goredis/blob/master/redis.go#L432

А вот пример блокировки в самом пуле connectino. https://github.com/xuyu/goredis/blob/master/redis.go#L287

Re redis-py — Он создает свой собственный внутренний пул соединений, если вы не используете его явно, поэтому он потокобезопасен, потому что под капотом соединения объединяются в глобальный пул. В принципе, то же самое.

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

1. Спасибо вам за ваш ответ. Мои заблуждения касаются того, когда что-то считается потокобезопасным. Нормально ли, если вы вызываете одну и ту же функцию из разных потоков/подпрограмм? Есть ли проблемы только с записью данных. Я действительно буду признателен за более подробный ответ о безопасности потоков в целом или ссылку на соответствующие материалы. 🙂

2. @cldy в целом — функции и все, что создается в стеке (временно во время выполнения функции), считается потокобезопасным и не используется совместно потоками. Как только у вас есть данные, к которым одновременно обращаются и изменяют разные потоки, все становится сложнее. Я предлагаю вам просто погуглить «безопасность потоков», и вы найдете бесконечное количество ресурсов 🙂