【问题标题】:Cache VS Session VS cookies?缓存 VS 会话 VS cookie?
【发布时间】:2010-10-07 21:07:31
【问题描述】:

关于缓存 VS 会话 VS Cookie 的注意事项是什么?

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

我应该改用缓存或 cookie 或某种组合吗?

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

我主要从事桌面编程,我觉得我在这里缺乏很多知识,所以任何可以扩展在哪里使用缓存、会话、Cookie(或数据库)的人将不胜感激

编辑: 从答案看来,DB 和 cookie 的组合是我想要的。

  1. 我必须将预订存储在连接到会话 ID 的数据库中
  2. 将会话 ID 存储在 cookie 中(加密)。
  3. 每个页面都加载检查 cookie 并从数据库中获取预订
  4. 我有一个每周运行一次的清理程序,用于清除未完成的预订。

我无法将预订存储为 cookie,因为这样用户就可以更改价格和其他敏感数据,而我必须验证所有内容(不能信任这些数据)。

我说对了吗?

感谢大家的精彩解释!

【问题讨论】:

  • 其实,如果你想在服务器上存储数据,你可以使用 ASP.NET 匿名标识而不是使用会话 ID。通过启用匿名标识,ASP.NET Profile 对象将自动为您处理映射和存储(对于经过身份验证和未经身份验证的用户)。

标签: asp.net session cookies state-management


【解决方案1】:

从桌面应用程序的角度进入 Web 世界时,状态管理是必须掌握的关键。

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

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

【讨论】:

  • ASP.NET Profile 对象将用户配置文件信息存储在数据库中。您可以轻松使用Profile["Key"] = "Value"; ;)
  • 农场中的分布式缓存、使用网站和 Wcf 服务进行缓存的情况如何?和 AppFabric 缓存?
  • @Kiquenet 我所说的只是 ASP.NET 中内置的状态管理解决方案。当然,还有许多更复杂的附加解决方案可用于更具体的场景。但是,我相信它们中的大多数在概念上属于我提到的类别之一,并且只是 ASP.NET 已经提供的可扩展版本。
【解决方案2】:

Web 本质上是断开连接的模型,提到的选项(会话、应用程序、缓存...)都不够可靠。会话将超时,工作进程回收等。

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

只要确保 Id 被加密,然后是 base64 编码的字符串,而不仅仅是一个数值。

编辑:

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

这里有更多详细信息和设置说明:http://msdn.microsoft.com/en-us/library/ms178586.aspx

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

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

【讨论】:

  • Session 支持使用 SQL Server 作为后端存储。
【解决方案3】:

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

如果您的状态存储在 InProc(默认设置)中,那么在场中拥有多个服务器也会给您带来问题,除非您实施了某种“粘性会话”,以使用户保持不变场中的服务器以供后续调用。

我尽量避免会话(在服务器上增加额外的负载和内存使用),并尽可能关闭视图状态以保持较小的页面大小。 Cookie 通常是最轻量级的选项,但您的用户可能已将其关闭,您将需要一个仍然允许他们使用该网站的后备模式。

编辑(根据提问者的回复添加说明):

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

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

【讨论】:

  • Viewstate,当它作为长二进制字符串存储在页面中时?我使用数据集并将数据集存储在会话对象中,是否也可以使用 viewstate 或者我必须在那里存储其他对象?
  • 嗨 Stefan,我已根据您的回复对我的回答进行了澄清。
【解决方案4】:

你必须知道的第一件事! cookie 由会话使用!服务器知道谁是您的用户,这要归功于每次请求在客户端和服务器之间交换的 cookie(这适用于 HTTP 标头 set-cookie 和 cookie)。

真正的问题是:

  • 如果你想在导航过程中存储用户信息,那么你应该使用 session.

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

然后考虑您希望将会话存储在何处:
如果您的站点必须具有高可分配性和高性能,那么您不能将会话存储在进程中,而是存储在数据库中。这样,您将能够在多个 Web 服务器之间共享工作。 但是您会失去简单性(因为您存储在会话中的对象必须是可序列化的),并且您的网络服务器和数据库服务器之间还有一次往返。

【讨论】:

    【解决方案5】:

    您不应该使用缓存对象来缓存会话数据,因为缓存在所有用户之间共享。相反,您可以使用 Asp.Net Profile properties 来存储您的数据,或者您可以将事件处理程序添加到 Session_End 事件并在用户离开计算机太久时存储数据。

    【讨论】:

    • 您可以 - 只要您使用会话 ID 为您的密钥添加前缀/后缀/其他内容。我一直都这样做。不要误解我的意思——我不在缓存中存储会话数据,而是在缓存中缓存会话数据。
    【解决方案6】:
    • Cookie 是协作软件之间共享的一条信息,通过将特定于客户端的信息存储在客户端的机器上,然后检索以获取状态信息。

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

    Cookie 版本:

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

    • 缓存是一种硬件或软件组件,用于存储数据,以便可以更快地处理未来对该数据的请求;存储在缓存中的数据可能是早期计算的结果,或者是存储在其他地方的数据的副本。

    【讨论】:

      【解决方案7】:

      Cookies以文本文件格式存储在浏览器中。它存储的数据量是有限的。它只允许4kb[4096bytes]。它不保存cookie 中有多个变量。

      我们可以轻松访问 cookie 值。所以它不太安全setcookie()函数必须出现在标签之前

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

      【讨论】:

        【解决方案8】:

        我总是对 LocalStorageSessionStorageCookie 感到困惑,但现在不会了。

        只需链接这些词就可以自我解释他们应该做什么。

        LocalStorage:LocalStorage,是什么意思,就是你对技术一窍不通,但靠它自己就能猜到。 它是一些在本地存储数据的存储。

        就是这样。

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

        Session Storage:它似乎也存储数据但与会话相关,那么它与 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 可以 通过将该 cookie 的 httpOnly 标志设置为 true 来确保安全。 这可以防止客户端访问该 cookie

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-20
          • 2011-11-18
          • 1970-01-01
          相关资源
          最近更新 更多