缓存VS Session VS cookies?

时间:2009-02-16 12:41:23

标签: asp.net session cookies state-management

有关Cache VS Session VS Cookies的注意事项有哪些?

例如:
我正在使用会话变量很多,并且当用户开始订购产品然后去吃午餐并在几小时后回来并继续预订时,有时会在预订应用程序中出现问题。我将预订存储在会话中,直到用户确认或中止预订,因此当用户只需在浏览器中单击X并且永不返回时,我无需与数据库通信并处理数据库中途的预订。

我是否应该使用缓存或Cookie或其他组合?

(同样,当应用程序出现错误时,会话对象会自行重置,因此我会遇到更多问题)

我主要做桌面编程,觉得我在这里缺乏很多知识,所以任何可以扩展使用Cache,Session,Cookies(或db)的人都会受到赞赏

编辑:从答案中可以看出,DB和Cookie的组合就是我想要的。

  1. 我必须将预订存储在连接到session-id
  2. 的数据库中
  3. 将会话ID存储在cookie中(加密)。
  4. 每个页面加载检查cookie并从数据库中获取预订
  5. 我有一个清理程序,每周运行一次,清除未完成的预订。
  6. 我无法将预订存储为cookie,因为用户可以更改价格和其他敏感数据,我必须验证所有内容(不能信任数据)。

    我做对了吗?

    感谢你们所有人的出色解释!

8 个答案:

答案 0 :(得分:82)

从桌面应用程序的角度来看Web状态时,状态管理是一件至关重要的事情。

  • Session用于存储服务器上当前网络会话的每用户信息。它支持使用数据库服务器作为后端存储。
  • Cookie应用于存储当前网络会话的每用户信息或客户端上的持久性信息,因此,客户可以控制cookie的内容。
  • Cache对象在单个应用程序中的用户之间共享。其主要目的是缓存数据存储中的数据,不应将其用作主存储。它支持自动失效功能。
  • Application对象在用户之间共享以存储应用程序范围的状态,因此应相应使用。

如果您的应用程序被许多未经身份验证的用户使用,我建议您将数据存储在cookie中。如果需要身份验证,您可以手动将数据存储在数据库中,也可以使用ASP.NET配置文件管理功能。

答案 1 :(得分:4)

Web本质上是断开连接的模型,并且提到的任何选项(Session,Application,Cache,...)都不够可靠。会话将超时,工作进程回收等等。

如果您确实需要可靠且长期存储用户进度,则数据库是您唯一的解决方案。如果您有用户配置文件(如果用户必须登录),那么它很简单。如果没有,请生成唯一ID,将其存储在cookie(或URL)中,并根据该标识跟踪用户。

确保Id已加密,然后是base64编码的字符串,而不仅仅是数值。

编辑:

在Mehrdad Afshari的原始问题和评论中进行了额外的解释之后,很好的解决方案是使用Session,但将存储设置为Sql Server而不是InProc。

以下是有关如何设置的详细信息和说明:http://msdn.microsoft.com/en-us/library/ms178586.aspx

请记住,您仍然会有会话超时,但它们将在应用程序池回收,甚至服务器重新启动后继续存在。

如果您确实需要永久存储,我最初概述的数据库自定义解决方案是唯一的解决方案。

答案 2 :(得分:2)

存储在服务器上的会话默认会在20分钟内超时(这是可调整的)。我会将其存储在cookie中,或者存储在视图状态(如果可用)中以防止超时。

如果您的状态存储在InProc(默认设置)中,那么在服务器场中拥有多个服务器也会导致问题,除非您实现了某种“粘性会话”,这将使用户保持相同服务器场中的服务器,用于后续调用。

我尝试尽可能避免会话(在服务器上放置额外的负载和内存使用量),并在可能的情况下关闭viewstate以保持较低的页面大小。 Cookie通常是最轻量级的选项,但您的用户可能已关闭此功能,您将需要一种允许他们使用该网站的后备模式。

修改(根据提问者的回复添加说明):

Viewstate存储在隐藏字段中,是Viewstate存储中所有对象的序列化表示。 Viewstate自动用于存储页面的状态,但如果您愿意,可以以编程方式显式地在Viewstate中添加和检索自己的对象。

所以是的,数据集可以存储在Viewstate中。

答案 3 :(得分:1)

您不应使用Cache-object来缓存会话数据,因为缓存是在所有用户之间共享的。相反,您可以使用Asp.Net Profile properties来存储数据,或者您可以向Session_End事件添加事件处理程序,并在用户离开计算机的时间过长时存储数据。

答案 4 :(得分:1)

首先你必须知道!会话使用 Cookie !由于每个请求在客户端和服务器之间交换的cookie,服务器都知道谁是您的用户(这适用于HTTP标头set-cookie和cookie)。

真正的问题是:

  • 如果要在导航期间存储用户信息,则应使用会话。

  • 如果您的客户端不支持cookie,那么您可以决定在每个请求中存储一个cookie,编码在URL中(服务器将使用URL而不是cookie来为请求找到正确的会话)。 / LI>

然后考虑您希望存储会话的位置:
如果您的网站必须具有较高的差异性和高性能,则您不得将会话存储在流程内但在数据库中。这样您就可以在多个Web服务器之间共享工作。 但是你会简单地放松(因为你在会话中存储的对象必须是可序列化的),并且你的web服务器和数据库服务器之间还有一次往返。

答案 5 :(得分:0)

Cookie 以文本文件格式存储在浏览器中。它存储了限制数据量。它只允许 4kb [4096bytes] 。它没有持有Cookie中的多个变量。

我们可以轻松访问Cookie值。因此安全性较低 setcookie()功能必须出现在标签之前

会话存储在服务器端。它存储了无限量的数据。它在会话中保存多个变量。我们无法轻松访问Cookie值。因此更安全

答案 6 :(得分:0)

  • Cookie 是合作软件之间共享的信息,通过在客户端计算机上存储客户端特定信息,然后检索以获取状态信息。

  • 选择了术语" Cookie "作为" 一个cookie是一个众所周知的计算机科学术语,用于描述由中间人持有的不透明数据"。这里的术语不透明意味着内容仅对服务器而不是客户端感兴趣并且相关。浏览器将自动将cookie包含在对cookie原始主机的所有后续请求中。 Cookie具有名称和值,以及域和路径,到期日期,版本号和注释等其他属性。 more

Cookie版本:

Cookie: cookie-name=cookie-value; Comment=text; Domain=domain-name; Path=path-name; Max-Age=seconds; Version=1; Secure
  • 服务器端会话数据可以存储大量数据,客户端 Cookie 数据的大小有限,从网站发送到服务器,Cookie通常包含通过此保存数据传输大小的参考代码。浏览器关闭后会话关闭,但Cookie存在的时间更长。浏览器将会话ID作为URL参数,cookie甚至HTTP标头发送到服务器。

  • 缓存是存储数据的硬件或软件组件,因此可以更快地提供对该数据的未来请求;存储在缓存中的数据可能是较早计算的结果,也可能是存储在其他地方的数据副本。

答案 7 :(得分:0)

我总是对 LocalStorage SessionStorage Cookie 感到困惑,但现在不再如此。

仅链接单词就可以自我解释它们应该做什么。

LocalStorage :本地存储是什么意思,只是您对技术一无所知,但您可以猜测。 这是一些在本地存储数据的存储器。

那是什么。

IT通过JavaScript代码或清除浏览器缓存将数据存储在浏览器 without any expiration until user clear it 中。

会话存储:似乎它也存储数据但与会话相关,那么它与localStorage有何不同?

主要区别是您的 session storage data will be deleted once the session is finish or browser tab is closed or the browser is closed

您可以通过设置

在浏览器控制台中尝试
localStorage.setItem('name' , 'alex')
sessionStorage.setItem('session','seesion value')

,然后关闭标签并再次打开,您仍然可以找到localStorage数据,但不能找到sessionStorage数据。

Cookie :因此,这与上述两个完全不同。 通常用于服务器端的Cookie。

  • 存储必须随后发送回服务器的数据 要求。
  • 其到期时间因类型和到期时间而异 持续时间可以从服务器端或客户端设置(通常 从服务器端)。
  • Cookie主要用于服务器端读取(可以 也可以在客户端读取),localStorage和sessionStorage可以 仅在客户端读取。
  • 大小必须小于4KB。
  • 饼干可以 通过将该Cookie的httpOnly标志设置为true可以确保安全。 这样可以防止客户端访问该Cookie