Postgresql или redis для данных, используемых в сокетах?
Здравствуйте.
Для браузерной игры на php будут использоваться сокеты, реализованные на node.js. Сокеты используются для карт, на которых взаимодействуют игроки. Игроки постоянно присылают данные о своих действиях, на сервере проверяем данные и отправляем ответ игроку, а в случае, когда он изменил свои координаты, то отправляем всем другим игрокам данные об этом (у них на клиенте отображается этот игрок на новых координатах). Соответственно, при обработке запросов постоянно используем и обновляем данные. Вопрос, как лучше организовать их хранение? Сразу в postgresql хранить и при каждом запросе от каждого игрока брать оттуда данные и туда, собственно, сохранять ИЛИ хранить в redis и при каждом запросе брать оттуда, а если в redis’е нет нужных данных, то уже брать из postgresql, и, конечно, периодически сохранять все данные из redis в postgresql.
Postgresql справится с такой нагрузкой?
Понятно, что ещё важно оптимизировать код, но сейчас поставлена задача решить, что использовать – postgresql или redis?
В общем случае, если данные позволяют их кэшировать, а не трогать каждый раз базу - лучше кэшировать. Более конкретно должен решать системный архитектор, исходя из специфики проекта.
Спасибо за ответ. Но ведь я как раз и написала, что координаты обновляются постоянно (игроки же почти всегда в движении находятся) и их каждый раз нужно сохранять, значит - трогать базу..
Посмотрите в сторону tarantool - он хранит данные в ОЗУ и имеет очень быструю запись + в нём можно хранить более сложные данные, чем просто k-v.
Но ещё стоит подумать над тем, чтобы не на каждый чих сохранять данные в бд, а например во время игры их хранить в ОЗУ сервера, а при отключении игрока уже сохранять последние координаты в БД.
Спасибо за ответ. Про tarantool слышу впервые, посмотрим)
в нём можно хранить более сложные данные, чем просто k-v.
Но значения ключей в redis имеют разные типы, в т.ч. множества, хеш-таблицы.
Получается всё равно нужно каждую минуту сохранять все данные из такой бд в postgresql. Каждую минуту, потому что это всё-таки игра, и игрок может многое сделать (преодолеть большой путь) за минуту и если эти данные потеряются, то игрок будет очень недоволен этим..
Один единственный postgresql, я так понимаю, не стоит и рассматривать? Лучше всего использовать промежуточно nosql бд?
Получается всё равно нужно каждую минуту сохранять все данные из такой бд в postgresql.
Почему каждую минуту? И зачем сохранять? Можно же постоянно в тарантуле и хранить.
Ну или сохранять только при отключении игрока. Или архитектура не позволяет?
Один единственный postgresql, я так понимаю, не стоит и рассматривать? Лучше всего использовать промежуточно nosql бд?
Почему каждую минуту? И зачем сохранять? Можно же постоянно в тарантуле и хранить. Ну или сохранять только при отключении игрока. Или архитектура не позволяет?
Хм. Сейчас уточняла этот момент. в общем, да, не нужно сохранять каждую минуту, можно реже..
Делается же это в принципе только из-за того, что, если сервер упал, то данные из памяти были сохранены перед этим (последнее сохранение сколько-то минут назад, или часов).
Какие-то важные действия будем сохранять сразу в postgresql.
Тогда вот так. И redis будем использовать.
Василий Банников, Глупый, наверно, вопрос, но получается это же и есть кэширование? В данном случае для него используем конкретно redis?
Таким образом, для всего проекта для кэширования можно использовать redis. (Просто пока что создаём основной функционал самой игры. К кэшированию собирались позже вернутся.)