Компромисс между пользовательскими данными в сеансе против базы данных?

При разработке более крупного сайта, управляемого пользователем, где каждый зарегистрированный пользователь имеет большой объем данных учетной записи, необходимый для навигации по сайту, что является хорошим балансом между тем, чтобы эти данные были легко доступны в сеансе, в отличие от необходимости читать его из базы данных , Заманчиво держать большую часть этого в сеансе, чтобы уменьшить то, что уже будет часто обращаться к db. Я специально думаю о сценарии, как о онлайн-игре, где есть много пользователей с большим количеством данных для своего игрока.

Если данные, о которых вы говорите, используются на каждой загрузке страницы, то сохранение его в сеансе, скорее всего, будет ОК. Если большая часть этих данных не используется при каждой загрузке страницы, то сохранение ее в БД (IE, выполнение запросов каждый раз), вероятно, является способом выхода. Вы также можете использовать кеш сеанса (что-то вроде memcache) для запроса данных 1 раз за сеанс, а затем захватить кеш в следующий раз. Проблема с хранением материала в сеансе заключается в том, что каждая из этих страниц содержит данные, которые, если это значительный объем данных, могут серьезно повлиять на нагрузку на ваш сервер, если у вас много подключений или длительных подключений.

Я предлагаю вам использовать простой идентификатор в сеансе, который вы используете для извлечения информации из db, но для повышения производительности используйте кеш. Поэтому, если данные находятся в кеше, возьмите это, иначе возьмите его из db.

Пример:

class User { public $username =""; public $moredata =""; public function logged() { // return true if logged } } $ttl = 10000 // cache time to live if($_POST['action'] == 'login') { $user = new User(); // populate $user, check credential... $_SESSION['loggeduser'] = $user->username; // saved data on db apc_add ( $_SESSION['loggeduser'] , $user ,$ttl ) } // .... if($_SESSION['loggeduser']) { $user = new User(); $user->username = apc_fetch( $_SESSION['loggeduser'],$success ) if(!$success) $user = populateFromDb( $_SESSION['loggeduser']); } 

Ответ: оба.

Данные в сеансе теряются по истечении срока действия, поэтому вы восстанавливаете данные из db в сеанс каждый раз, когда sessino теряется.

Сайт, который обрабатывает много пользователей одновременно, с большим количеством пользовательских данных, всегда использовал базу данных с ключом / значением, управляемую оперативной памятью (Redis, Memcached, ..) в качестве вашего бэкэнд (session.handler).

Данные должны быть доступны быстро.

Но вместо того, чтобы помещать все в СЕССИЮ, вы только ставите там идентификатор. Остальное по-прежнему идет в Memcached, и вы загружаете только нужные вам данные, поэтому ваш PHP-процесс на сервере потребляет немного меньше памяти .

Таким образом, у вас есть преимущество сверхбыстрых данных, теперь некоторые математические данные:

Если все ваши пользователи, скажем 1kk, имеют каждый 1 КБ данных, это ~ 1 ГБ. Сколько памяти у серверов сейчас? 16-256 ГБ. Память – достаточно места для всех пользовательских данных в ОЗУ .

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

Я всегда использую UserID как сезон и использую некоторые запросы для отображения важной информации.

Используйте оба варианта 🙂