2012-04-09 98 views
16

我在PHP中使用会话来跟踪用户是否已登录。我不使用它来存储有关用户的任何其他数据;基本上就像检查一个散列表来查看用户是否已经过认证。redis vs本机会话

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

我对性能,可伸缩性和安全性(并非真正关心代码复杂性)感到好奇。

+1

我真的不觉得你需要担心很多会话,除非你得到大量的流量,PHP处理会话很好,如果你只存储那么少的数据,即使有很多请求也应该没问题,并且关于它的性能应该很接近,因为redis不是PHP本地的。 – gosukiwi 2012-04-09 16:42:14

+0

@gosukiwi谢谢!大量的意思是什么?像10k用户一次,或像1mil?我知道这取决于我的机器,但即时通讯尝试查看,如果PHP可能有一些上限(如将每个会话存储为单个文件,使其受操作系统文件系统性能影响)。 – tau 2012-04-09 16:53:05

+1

那么我会担心在这种情况下的服务器的内存使用情况,因为它都存储在RAM中,与10K用户,如果每个用户使用像会话的1kb数据,它会消耗10,000kb或10〜MB,这不是很大程度上,PHP足够聪明,可以使用足够好的数据结构来保存并快速写入和读取这些值,问题在于会话数据太大或者由于某种原因服务器消耗了太多的资源来读取会话数据,但是这通常是因为数据太大。 – gosukiwi 2012-04-09 16:58:22

回答

-35

会不会有一些优势,使用Redis的,而不是本地的PHP会议?

性能 - PHP会话更好。它们将比Redis更快,因为它从RAM读取而不是通过网络读取数据。

可扩展性 - Redis会话更好。 PHP会话只能在一台机器上运行。如果您需要多台机器来处理请求,则必须执行粘性会话。借助Redis,几台机器可以共享会话状态。用户请求可以毫无问题地进入任何服务器。

耐用性 - 如果Web服务器由于某种原因而崩溃,将会失去所有会话状态。借助Redis,您可以拥有各种持久性选项。你可以确保即使某个特定的Redis服务器出现故障

安全不会丢失会话信息 - 您可以通过两种方法实现极大的安全,也可以完全乱了使用这两种方法。所有的事情都是平等的,我会说PHP会话会更安全一些,因为有一件事要担心。

+44

PHP会话不是存储在RAM中,而是存储在磁盘上的文件。谁告诉你,当Web服务器重新启动时,他们会丢失? – ThiefMaster 2012-04-10 10:36:08

+0

@ThiefMaster - 我没有意识到PHP会话存储在磁盘上。这就是说,我对耐久性的观点是。如果服务器崩溃(而不是重新启动),则会丢失会话数据。借助Redis或MySQL支持的会话,您拥有更好的耐用性。 – 2012-04-10 10:41:37

+9

即使你不一定会失去他们。除非操作系统崩溃,会话文件损坏或实际上没有写入硬盘。 – ThiefMaster 2012-04-10 10:43:09

0

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

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

11

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

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

数据库方法(使用InnoDB)是我在使用File w/NFS后遇到的最慢的方法。锁定和写入争用是主要因素。 Memcache和Redis提供了类似的性能,并且由于所有操作都在RAM中,因此是更好的选择。 Redis是我的选择,因为您可以启用磁盘持久性,而Memcache仅基于内存。

我解释Redis Sessions in PHP with Kohana如果你想要更多的细节。这里是我们管理的Redis键仪表板:

Redis Dashboard

12

使用类似的Redis用于存储会话是一个伟大的方式来摆脱负载平衡服务器的更多性能。

例如,在亚马逊网络服务上,负载平衡器具有所谓的“粘性会话”。这意味着当用户第一次连接到您的网络应用时,例如当登录时,负载平衡器将选择一个应用服务器,并且该用户将继续从该服务器提供服务,直到他们退出应用程序。这是因为PHP使用的会话将存储在首次使用的应用程序服务器上。

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