Сколько данных, переданных из PostgreSQL в Redis в одном пакете, считается надежным? - PullRequest
0 голосов
/ 25 января 2019

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

Один из вариантов использования: при входе пользователя в систему я хочу кэшировать все идентификаторы его друзей в Redis.Мы социальная платформа, поэтому у пользователя может быть много друзей, 1К, 10К или даже больше.

Поэтому, когда пользователь входит в систему, мне нужно сделать что-то, как показано ниже (например, Python, но вопрос должен быть не языковым)

cur = pg_conn.cursor()
cur.execute('SELECT friend_id FROM friends WHERE user_id = ?', user_id)
friend_ids = [item['friend_id'] for item in cur.fetchall()]
cur.close()
redis.sadd('%s.friends' % user_id, *friend_ids) 

Мой вопрос: при какой величинеданные могут обрабатывать этот кусок кода.Допустим, friend_id - это UUID (36 байт). Сколько friend_id я могу запросить не более, чтобы этот фрагмент кода мог надежно перенести эти идентификаторы из PostgresSQL в Redis?

Какие факторы могут повлиять на верхний предел размера передачи данных?Предполагая, что оба сервера приложений, PostgreSQL и Redis работают в одном регионе AWS.

Надежно, я имею в виду, что приведенный выше код, скорее всего, не даст сбой (> 99% или 99,9% или около того), но не должен быть таким же надежным, как банк.

1 Ответ

0 голосов
/ 25 января 2019

Согласно документации Redis: https://redis.io/commands/sadd

Доступно с 1.0.0.

Сложность времени: O (1) для каждого добавленного элемента, поэтому O (N) кдобавьте N элементов, когда команда вызывается с несколькими аргументами.

SADD очень производительный и не будет зависеть от текущего размера ключа redis, вы не можете улучшить эту производительность (путем моделирования / изменениязапрос ...), это уже лучший вариант!

Это означает, что только сеть (в основном время пинга между redis и вашим сервером, вы можете измерить это) и размер N имеют значение (в основном из-за пропускной способности сетииспользование).

Redis является однопоточным, так что одновременно обрабатывается только один SADD, вам понадобятся очень большие вставки (много элементов для вставки, я думаю, 10k не кажется таким впечатляющим), чтобы замедлитьвниз редис.В большинстве случаев вы больше беспокоитесь об освобождении памяти на Redis (что вы должны контролировать).

Эти параметры зависят только от качества вашей инфраструктуры, которое должно быть отличным (или вы можете легко улучшить его, изменив серверы / vpc у своего облачного провайдера).

Если вы действительно беспокоитесь оРазмер полезной нагрузки в сети, вы можете использовать скрипт lua, который будет выполнять команду SADD и архивировать полезную нагрузку перед вызовом redis и разархивировать его внутри скрипта, это должно снизить нагрузку на вашу сеть.

Для надежности,Лучше всего использовать какой-либо процесс автоповтора для повторного запуска, если по какой-либо причине произошел сбой первого SADD (см., например, схему автоматического выключателя).

...