6

我正在创建一个电子商务应用程序,其中我有一个购物车。

我目前的结构是,每当用户保存产品时,我将产品放在数据表和数据表中的会话中,所以在会话没有超时之前,用户可以拥有他们保存的列表。

然而,我已将会话超时增加到 600 分钟(10 小时),但我担心的是,这是存储购物车信息的最佳方法吗,因为如果有 1000 个用户同时访问该站点,则会创建 1000 个会话对象在服务器上,它不会降低我网站的性能。

我无法将其存储在数据库中,因为如果用户是匿名的,我没有关于该用户的独特信息,这样,如果 1000 个用户正在访问该站点,所有产品将被合并,我将无法获取当前用户保存的产品。

有没有其他更好的方法来解决这个问题。

4

3 回答 3

27

你不应该这样实现。10 小时的会话非常长,如果您的网站上有 1000 个用户,您的服务器将会受到影响并且会产生一些性能问题。

在我们的电子商务网站上,我们为匿名用户创建了一个 cookie。完成此操作后,您有两个解决方案:

  1. 将整个篮子存储在 cookie 中(基本上是产品 ID + 数量的列表,更多取决于您的需求/策略)或其他技术(例如 localStorage)。
  2. 在 cookie 中存储一个唯一的 ID,并将篮子存储在数据库(临时表)中,并以唯一的 cookie ID 作为标识符。一旦用户登录到系统,您就可以将这些数据移动到用户购物篮表中。

您可以轻松更改 cookie 的到期时间(或将其删除),而不会影响服务器的整体性能。对于 ID,您可以使用Guid.NewGuid().

更新:

关于我的第二个解决方案的更多细节 - 场景:

  1. 用户访问网站
  2. 您创建一个没有过期日期的 cookie:cartId 和值Guid.NewGuid()(名称和值由您决定)。
  3. 用户点击“购买”
  4. 获取 cookie 服务器端并将 cartId、product/quantity 添加到“AnonymousBasket”表
  5. 想象一下用户离开网站并在一个月后回来,cookie 仍然存在
  6. 如果匿名用户转到他的购物篮,您就可以根据 cookie 的价值获得他的产品和数量。
  7. 如果用户登录您删除 cookie 并将数据从表“AnonymousBasket”移动到“Basket”
  8. 现在您的登录用户可以处理结帐

使用此解决方案,所有内容都保存在数据库中,并且不需要会话。您可以像对会话所做的那样更改 cookie 的过期时间,或者您可以毫无风险地清理临时表或创建匿名用户的统计信息(为什么他们没有进行结帐,平均有多少项目,哪个项目,. ..)。

于 2013-08-22T11:42:35.423 回答
1

@glautrou 的回答非常充分,我也不支持这样做session

除了@glautrou 的回答,我将解释如何在一张桌子上工作而不创建不同的桌子。

工艺步骤:

  1. 用户访问您的网站
  2. 无需登录网站即可将产品添加到购物车
  3. 将产品添加到购物车时,您会cart cookie为用户创建一个。您可能对此 cookie 没有时间限制,或者您可以设置 1-3-6 个月的限制。(请注意,如果用户删除了他们的 cookie,那么将 cookie 保留那么长时间没有多大意义。)
  4. 这样cart cookie,您将产品信息保存在购物车表中(通过ProductId)。(ProductId、UserCookieCartCode、数量等)
  5. 只要用户不删除 cookie 或 cookie 过期,用户每次访问网站前都会看到添加到购物篮的产品。*

*当然,这些产品可能已停售或价格可能会发生变化。您也可以进行此类检查。

现在让我通过一些练习来解释它们:

如果访问者将项目添加到购物车而不是成员,您可以创建一个cart cookie并将此值添加到Shopping Cart表中,例如在VisitorCookieId字段中。

如果访问者决定登录,您将登录userID与匹配VisitorCookieID并更新该UserID字段。如果一个人希望注册一个新的,这同样适用。这是用户体验方面的一个重要标准。

因此,您可以从同一张表中管理登录/非会员访问者的信息。

数据库结构示例如下(以 为例SQL Server):

在此处输入图像描述

在这里,您只能创建一个ShoppingCart表并将诸如UserIdVisitorCookieIdProductId、等信息保存Quantity在一个表中。但是,“在我看来”这不是正确的方法,因为如果用户将此购物车转换为订单,您必须采取额外的措施,因为同一用户会有多个订单行。在这种结构中,您使用单个订单信息进行交易。

也许您可以OrderId在表格中添加一个字段ShoppingCart并在订购购物车时绑定它们。当然,除非您永久删除变成订单的购物车信息,否则这将是有效的。

这里有一些重要的事情;正如我上面提到的,用户可能会删除 cookie,可能不会再次访问该站点,或者可能不会购买他添加到购物车中的产品。这对于您的用户体验报告来说是非常重要的数据。

例如;

  • 如果访问者在未登录的情况下将产品添加到购物车,则 cookie ID 将添加到 VisitorCookieId 字段。在这里您可以分析未注册/未登录的访问者。
  • 如果访问者将产品添加到购物车然后登录,您还将更新与此 cookie ID 匹配的 UserId 字段,正如我在第一行中解释的那样。因此,您可以分析未登录交易的会员。新注册的情况相同,这种情况下,您可以查看加入购物车的日期和会员日期。
  • 您可以检查那些VisitorCookieId字段为空且UserId字段已满的人,作为登录并采取行动的人。当然,这里还有另一个分析机会。这些成员是否还有其他填写了 VisitorCookieId 字段的订单?

这些例子不胜枚举。总之,使用 Cookie 代替 Session 在数据库和应用程序性能方面是有益的。此外,使用 Session 进行交易并不总是提供相同的效率,即使您设置了数据的持续时间,它也可能在该时间之前丢失。

cookie 也可能存在问题;用户可以删除 cookie 或不允许 cookie。在这种情况下,我们将尊重用户的选择,并向他们明确表示,如果他们不使用 cookie,将无法从网站获得良好的性能。

与一般标准一样,重要的是要确定哪种方法最适合您的结构。您找到适合自己的解决方案可能会更好,而不是通用标准。在这里,我提出了一个建议,将通用标准与适合我的解决方案结合起来,希望对这个页面的新手有用。

** 如果您想定期删除此数据、将其移动到不同的表或报告它,您可以为它们创建计划任务结构。Quartz.Net或者Hangfire对这些有用。

于 2021-12-04T23:19:32.307 回答
0

这个想法怎么样,如果匿名用户将项目放入篮子,则将填充 sql 的临时数据表。每个项目的 ID 是 session.ID(asp 的随机字符串)。

如果用户想完成该过程,他将在完成将商品添加到购物车后登录;一切都很好。

如果用户不会继续购物,并且数据表已经填满;您在 session.timeout 调用脚本。此脚本从数据库表中删除所有项目 WHERE userID=session.ID (=anonymous)

好主意还是坏主意?

于 2020-05-02T20:35:45.453 回答