在文件与数据库中存储会话数据的优缺点是什么?

时间:2011-06-28 16:45:33

标签: php asp.net python ruby-on-rails ruby

在构建网站时,必须决定在用户​​登录时如何存储会话信息。

将每个会话存储在自己的文件中与将其存储在数据库中的优缺点是什么?

3 个答案:

答案 0 :(得分:3)

我通常不会将这些信息存储在一个文件中 - 你冒着将这个文件交换进出内存的风险(是的,它有时可以缓存)但是我宁愿使用这样设计的内存机制。你正在使用相当不标准的东西。 在ASP.Net

  1. 您可以在内存集合中使用,该内存集合适用于单个服务器。如果您需要多个负载均衡的Web服务器(Web场),并且用户可以在每次请求时进入任何其他服务器,则此选项并不好。如果Web进程重新启动,则会话将丢失。他们也可以超时。

  2. 您可以在asp.net中使用状态服务器进行多服务器访问 - 这在您的Web服务器进程之外运行。如果Web进程重新启动 - 您可以,并且多个服务器可以访问它。进入状态服务器的流量未加密,理想情况下,您可以使用IPSEC策略在更安全的环境中保护流量。

  3. 您可以使用sql server来管理状态(自动),方法是设置web.config以使用sql server作为会话数据库。这提供了高性能数据库和多服务器访问的优势。

  4. 您可以在数据库中使用自己的会话,如果您需要它们在常规机制之外持续很长时间并希望更严格地控​​制数据库字段(可能您想查询特定字段)

  5. 也只是出于好奇 - 也许你将会话称为用户偏好?在那种情况下研究asp.net的个人资料

答案 1 :(得分:1)

Asp.net不利于在一个文件中存储会话,但我不确定r-o-r。但是,在内存中(同一进程)存储会话比在数据库中存储会话要快。将它放在数据库中可能会为您的应用程序提供更好的可扩展性(如果您想在Web场环境中部署应用程序 - 所有服务器都有一个公共(db)来查找会话。)

This代码项目文章提供了对asp.net会话管理的非常好的见解。

答案 2 :(得分:1)

我猜测,根据您之前的问题,这是在使用perl的CGI :: Application模块,CGI :: Application :: Plugin :: Session的上下文中提出的。如果您使用具有默认设置的模块,它会将会话数据写入存储在/ tmp目录中的文件 - 这与PHP的操作非常相似。如果您的应用程序在共享托管环境中运行,出于安​​全原因,您可能不希望这样做,因为其他用户可能能够查看/修改/ tmp中的数据。您可以通过将文件写入只有您具有读/写权限的目录(即,不是/ tmp)来解决此问题。在开发时,我更喜欢使用YAML进行序列化,而不是默认(可存储),因为它是人类可读的。如果你有自己的Web服务器,并且你能够在同一台机器上运行数据库(mysql)服务器,那么将会话数据存储在数据库而不是文件中通常会产生更高的性能 - 特别是如果你能够维护持久的数据库连接(即使用mod_perl或fastcgi)。但是 - 如果您的数据库位于远程主机上,并且每次需要更新会话数据时都必须打开新连接,那么性能实际上可能会更糟,并且写入文件可能会更好。请注意,您也可以使用sqlite,它看起来像您的应用程序的数据库,但实际上只是本地文件系统上的文件。无论性能如何,由于带宽限制和其他资源限制,数据库选项在共享主机环境中可能是不合需要的。对于低流量站点(即每天几千次点击),性能差异也可能微不足道。