Php 会话中的用户数据与数据库中的用户数据之间的权衡?

Php 会话中的用户数据与数据库中的用户数据之间的权衡?,php,database,session,Php,Database,Session,当开发一个更大的用户驱动的站点时,每个登录的用户在站点中导航时都需要大量的帐户数据,那么在会话中轻松访问这些数据与从数据库中读取这些数据之间有什么好的平衡呢。为了减少已经频繁的数据库访问,最好将大部分数据库保持在会话中。我特别想到了一个类似于在线游戏的场景,其中有许多用户为他们的玩家提供了大量数据。这实际上取决于每个用户拥有多少价值。此外,如果存在动态值,例如用户名(可以更改,也可以更改名字和姓氏) 我总是使用UserID作为季节,并使用一些查询来显示重要信息 同时使用:)我建议您在会话中使用一

当开发一个更大的用户驱动的站点时,每个登录的用户在站点中导航时都需要大量的帐户数据,那么在会话中轻松访问这些数据与从数据库中读取这些数据之间有什么好的平衡呢。为了减少已经频繁的数据库访问,最好将大部分数据库保持在会话中。我特别想到了一个类似于在线游戏的场景,其中有许多用户为他们的玩家提供了大量数据。

这实际上取决于每个用户拥有多少价值。此外,如果存在动态值,例如用户名(可以更改,也可以更改名字和姓氏)

我总是使用
UserID
作为季节,并使用一些查询来显示重要信息


同时使用:)

我建议您在会话中使用一个简单的标识符,用于从数据库检索信息,但对于性能问题,请使用缓存。因此,如果数据在缓存中,则从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']);
}

如果您正在谈论的数据正在每个页面加载上使用,那么将其存储在会话中可能就可以了。如果大多数数据没有在每次页面加载时使用,那么将其存储在数据库中(即每次运行查询)可能是一种方法。您还可以使用会话缓存(类似于memcache)在每个会话中查询数据1次,然后下次从缓存中抓取数据。在会话中存储内容的问题是,这些数据的每个页面加载都在内存中,如果数据量很大,如果您有很多连接或长时间运行的连接,则会严重影响服务器上的负载

回答:两者都有。

会话中的数据在到期后丢失,因此每次会话号丢失时,都要将数据库中的数据恢复到会话中

作为一个一次处理多个用户、拥有大量用户数据的站点,我总是使用RAM键/值驱动数据库(Redis、Memcached等)作为后端(session.handler)

数据需要能够快速访问

但是,不是将所有内容都放入会话,而是将ID放在会话中。 其余的仍然放在Memcached中,您只加载真正需要的数据,因此,服务器上的PHP进程消耗的内存确实少了一点

因此,您有了超快数据的好处,现在做一些数学计算:


如果您的所有用户(比方说1kk)都有1KB的数据,这就是~1GB。服务器现在有多少内存?16-256 GB内存- <强>为RAM中的所有用户数据提供足够的空间。

你必须考虑的很多事情……比如Caseas Us1818933说有很多不同的事情要考虑。会话数据是否存储在DB表中?如果是这样的话,那么把它全部放在会议上可能是值得的。但是,如果用户数据可能会发生变化,则该数据将不断更新,只需将其保存在“用户数据”表中就值得了。缓存对该数据很有用,可以防止不断请求该数据,但请记住,如果缓存数据发生更改,则必须使其无效。如果没有关于您的全部需求的更多信息,就很难提供正确的答案!我在想,那些不会经常改变或显示的信息(如成就)应该留在数据库中,并在显示时重新显示,但通常显示的信息(如金额)应该在会话中显示。我喜欢这样。是时候学习更多关于PHP缓存库的知识了。这不会是一个很大的数据量。大概50个左右的短字符串和整数。