redis 与本机会话

Posted

技术标签:

【中文标题】redis 与本机会话【英文标题】:redis vs native sessions 【发布时间】:2012-04-22 00:23:36 【问题描述】:

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

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

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

【问题讨论】:

我真的认为你不需要太担心会话,除非你有大量的流量,PHP 可以很好地处理会话,如果你只存储少量数据,即使使用很多请求,关于性能应该很接近,因为 redis 不是 PHP 原生的。 @gosukiwi 谢谢!你说的大规模是什么意思?像一次有 10k 用户,还是像 100 万?我知道这取决于我的机器,但我想看看 php 是否有一些上限(比如是否将每个会话存储为一个单独的文件,使其受操作系统文件系统性能的影响)。 好吧,我会担心这种情况下服务器的内存使用情况,因为它都存储在 RAM 中,有 10k 个用户,如果每个用户使用 1kb 的会话数据,它将消耗 10,000kb 或10~mb,不算多,PHP足够聪明,可以使用足够好的数据结构来保存并快速写入和读取这些值,问题是会话数据太大,或者由于某种原因服务器消耗太多资源读取会话数据,但通常如果数据太大。 @gosukiwi 这就是我正在寻找的答案;谢谢! 只是为了记录,gosu kiwi 和 Sripathi Krishnan 都错了。默认情况下,PHP 将会话存储在临时文件中,这意味着 redis 总是会表现得更好(因为它主要是基于内存的)。但话虽如此,如果你一开始没有遇到瓶颈,那么切换到 redis 可能不会获得显着的改进。 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于redis 与本机会话的主要内容,如果未能解决你的问题,请参考以下文章

如何在网站中结合facebook登录和本机登录之间的会话

使用 Redis 与 memcached+db 作为 Django 会话系统的优缺点?

Redis系列:发布与订阅

Redis如何通过本机客户端访问远程服务器段

redis介绍及保持session会话

保持 HttpUrlConnection 调用之间的会话(本机/Webview)