24

我在 PHP 中使用会话来跟踪用户是否登录。我不使用它来存储有关用户的任何其他数据;本质上,这就像检查哈希表以查看用户是否已通过身份验证。

使用 redis 代替原生 PHP 会话会有一些优势吗?

我对性能、可扩展性和安全性(并不真正关心代码复杂性)感到好奇。

4

3 回答 3

25

使用 Redis 之类的东西来存储会话是从负载平衡服务器中获得更多性能的好方法。

例如,在 Amazon Web Services 上,负载均衡器具有所谓的“粘性会话”。这意味着当用户首次连接到您的 Web 应用程序时,例如登录时,负载均衡器将选择您的应用程序服务器之一,并且该用户将继续从该服务器获得服务,直到他们退出您的应用程序。这是因为 PHP 使用的会话,例如,将存储在他们第一次开始使用的应用服务器上。

现在,如果您在单独的服务器上使用 Redis,然后在每个应用服务器上配置 PHP 以将其会话存储在 Redis 中,您可以关闭此“粘性会话”。这意味着您的任何服务器都可以访问会话,因此,对于您的应用程序的每个请求,都会从不同的服务器为用户提供服务。这最终可以更有效地使用您的负载平衡设置。

于 2014-11-02T18:05:22.313 回答
25

您希望会话保存处理程序快速。这是因为 PHP 会话将阻止来自同一用户的所有其他并发请求,直到第一个请求完成。

有多种处理程序可用于跨多个服务器的 PHP 会话:带 NFS 的文件、MySQL 数据库、Memcache 和 Redis。

在我的经验中,数据库方法(使用 InnoDB)是最慢的,其次是带有 NFS 的文件。锁定和写竞争是主要因素。Memcache 和 Redis 提供类似的性能,并且是迄今为止更好的选择,因为所有操作都在 RAM 中。Redis 是我的选择,因为您可以启用磁盘持久性,而 Memcache 仅基于内存。

如果您想了解更多详细信息,我会用 Kohana 解释PHP 中的 Redis 会话。这是我们用于管理 Redis 密钥的仪表板:

Redis 仪表板

于 2014-03-17T23:22:36.123 回答
0

我真的不认为你需要担心会话,除非你有大量的流量,PHP 很好地处理会话,如果你只存储很少的数据,即使有很多请求也应该没问题,关于性能应该很接近,因为 redis 不是 PHP 原生的。

10k 用户,如果每个用户使用 1kb 的 session 数据,消耗 10,000kb 或 10~mb,不算多;PHP 足够聪明,可以使用足够好的数据结构来保存和快速写入和读取这些值。问题是会话数据是否太大,或者由于某种原因服务器在读取会话数据时消耗了太多资源,但通常是数据太大。

于 2012-04-09T17:09:59.280 回答