购物车系统设计方案

news2024/11/15 10:01:58

背景

在电商领域,购物车(Shopping Cart)扮演着至关重要的角色,它是连接用户浏览商品与最终完成购买行为的桥梁。

从两个视角来阐述,作为ToC的购物车,存在的意义:

从用户角度:

  1. 收集与整理商品:
    便于管理和查看,在多个商品间进行比较,而不必立即做出购买决策。
  2. 便于批量操作:
    提供购物车内的商品排序功能,如按价格、销量等排序,帮助用户快速做出决策。
  3. 计算总价与优惠:
    购物车会自动计算所有选中商品的总价,让用户一目了然地了解购物总成本。

从平台角度:

  1. 促进消费:
    当用户在购物车中看到心仪的商品时,更容易产生冲动消费的行为。
  2. 数据收集与分析:
    通过分析用户加入购物车但最终未购买的商品,平台可以优化商品推荐算法和促销策略。
    购物车数据还能帮助电商平台了解用户的购物习惯和偏好,为个性化营销提供依据。

问题

业务角度:未登录和登陆时的购物车设计。

技术角度:ToC的流量较大,如何保证购物车系统的可用性?

针对未登录的购物车,数据是暂存的,登录之后,可以将暂存的购物车数据合并到登录的用户的购物车中,同时需要保证该用户的购物车数据持久化。

那这里就有两个问题,暂存的数据该如何展示?登录之后的购物车用什么存储?

方案

我们这里以京东零售购物车为例。

首先分析一下购物车的数据结构:

  1. 显性
    店铺名称、商品名称、SKU名称、销售价、数量、总价、标签、勾选状态、是否有货
  2. 隐性
    店铺ID、商品ID、SKU ID、标签ID、创建时间、变更时间
    在这里插入图片描述

未登录的购物车

未登录的购物车存在哪里?客户端还是服务端?

如果存在服务端,未登录的购物车一定要有一个唯一标识,这样做显然不太合适,所以我们需要将未登录的购物车信息保存在客户端。

客户端存储的方案就有很多了,Session、Cookie、LocalStorage。Session实际上还是会保存在服务端,不合适。LocalStorage设计太过复杂,排除。

使用 Cookie 存储,实现起来比较简单,加减购物车、合并购物车的过程中,由于服务端可以读写 Cookie,这样全部逻辑都可以在服务端实现,并且客户端和服务端请求的次数也相对少一些。

登录的购物车

登录的购物车数据信息就需要持久化到数据库中了。

数据库选型怎么选?读写性能较优的Redis?具备结构化的MySQL?

显然使用 Redis 性能要比 MySQL 高出至少一个量级,响应时间更短,可以支撑更多的并发请求,这一点 Redis 完胜。

MySQL 的数据可靠性是要好于 Redis 的,因为 Redis 是异步刷盘,如果出现服务器掉电等异常情况,Redis 是有可能会丢数据的。但考虑到购物车里的数据,对可靠性要求也没那么苛刻,丢少量数据的后果也就是,个别用户的购物车少了几件商品,问题也不大。所以,在购物车这个场景下,Redis 的数据可靠性不高这个缺点,并不是不能接受的。

MySQL 的另一个优势是,它支持丰富的查询方式和事务机制,这两个特性,对我们今天讨论的这几个购物车核心功能没什么用。但是,每一个电商系统都有它个性化的需求,如果需要以其他方式访问购物车的数据,比如说,统计一下今天加购的商品总数,这个时候,使用 MySQL 存储数据,就很容易实现,而使用 Redis 存储,查询起来就非常麻烦而且低效。

当然,我们也可以采用Redis+MySQL进行数据双写,Redis抗流量,MySQL做持久化和数据兜底,但是也要保证二者数据的一致性。

数据变更

购物车中的商品的基本信息可能会发生变更。如果是热卖的商品,价库可能变动的也会非常频繁,如果产品中心的产品价库发生变更,用户的购物车的商品怎么变?

如果实时变更的话,产品中心的产品发生变动,将变动事件广播给购物车系统,如果针对所有用户的购物车的这个产品都做变更,系统和数据库压力都会非常的大。

我们这里可以采取限流变更和延迟变更。

限流变更就是控制变更的流量,比如基于系统的性能,使用令牌桶算法和动态滑动窗口算法来做用户购物车的数据变更操作。

延迟变更就是暂不感知数据的变更情况,等用户点击【去结算】的时候,交易域会对商品的数据进行【预校验】,如果发现商品价库发生变更,发送【刷新价库事件】广播给购物车系统,再做该用户数据变更操作。这样就避免了流量集中问题。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2050288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ssm大学生实习管理系统的设计与实现-计算机毕业设计源码45837

摘 要 在信息时代,随着网络的快速发展,各个行业都离不开信息的处理。在这样的背景下,高校需要以学生管理信息为导向,并与学生实习的持续创新相结合。因此,设计一个高校学生实习管理系统就显得非常必要。 该系统采用了B…

维基百科向量搜索;简单易用的GraphRAG实现;友好的人工智能助手;AI的音乐多模态

✨ 1: Semantic Search on Wikipedia 维基百科向量搜索 为了证明 Upstash Vector 的可扩展性,Upstash在一个数据库中以 11 种语言(144m 向量)索引了整个维基百科 ◆ 超过700GB的数据 ◆ 快速语义搜索 ◆ 与维基百科聊天 为您提供了一款可…

Unity--AssetBundle AB包管理器

1.简介 AB包(AssetBundle)是Unity中用于资源管理的一种机制,它允许开发者将多个文件(如纹理、模型、音频等)打包成一个单独的文件,以便于在游戏运行时动态加载和卸载。 但是现在出现了最新的Addressable来…

Python匿名函数之lambda表达式使用详解

概要 在Python编程中,函数是组织代码和实现逻辑的基础单元。除了使用def关键字定义命名函数外,Python还提供了创建匿名函数的方式,即lambda表达式。lambda表达式是一种简洁的函数定义方式,通常用于需要简短函数的场景。本文将详细介绍Python匿名函数的概念、使用场景及其高…

基于51单片机的双机通信控制系统proteus仿真

地址: https://pan.baidu.com/s/1Y4wOJKOYf2E4JeEktyKdTw 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…

微分方程(Blanchard Differential Equations 4th)中文版Section3.1

3.1 PROPERTIES OF LINEAR SYSTEMS AND THE LINEARITY PRINCIPLE(线性系统问题与线性算子原理) 在第2章中,我们专注于研究微分方程组的定性和数值方法。之所以这样做,是因为我们很少能找到具有两个或更多个因变量的系统的明确解公式。唯一的例外是线性系统。在本章中,我们…

Linux·权限与工具-yum与vim

1. Linux软件包管理器 yum 1.1 什么是软件包 在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。但这样做太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成Win…

12.2 使用prometheus-sdk向pushgateway打点

本节重点介绍 : 使用golang sdk打prometheus4种指标,推送到pushgateway gauge、counter、histogram、summary的初始化4种类似的设置值的方法推送到pushgateway的方法 prometheus配置采集pushgateway,grafana上配大盘 golang-sdk 项目地址 https://git…

【图数据库系列】Cypher查询语句:常用语法指南

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

HTML常用标签和CSS的运用,以及使用HTML做一个简历

目录 1.HTML标签 1.1 文档结构标签 1.2 文本格式标签 1.3 列表标签 1.4 链接和媒体标签 1.5 表格标签 1.6 表单标签 1.7 分区和布局标签 1.8 元数据标签 2.css样式 2.1 字体样式 2.2 文本样式 2.3 背景样式 2.4 边框样式 2.5 间距样式 2.6 宽度和高度 2.7 显示…

三种简单排序:插入排序、冒泡排序与选择排序 【算法 05】

三种简单排序:插入排序、冒泡排序与选择排序 在编程中,排序算法是基础且重要的知识点。虽然在实际开发中,我们可能会直接使用标准库中的排序函数(如C的std::sort),但了解并实现这些基础排序算法对于理解算法…

JS编程中有哪些常见的编程“套路”或习惯

JS编程中有哪些常见的编程“套路”或习惯 从个人的编程经验来看,不管你是前端JS编程还是后端Java编程,在一些习惯上基本是通用的。就是你编写的JS代码必须要功能完善且易于阅读易于维护。那么这里整理一下JS编程过程中一些比较行之有效的编程习惯。 函数…

3.Default Constructor的构造操作

目录 1. 问题引入 2. 4种implicitly声明的default constructor 1. 问题引入 “default constructors......在需要的时候被编译产生出来”。关键词是“在需要的时候”,被谁需要,做什么事情?看看下面的代码,然后梳理下思路。 cl…

章二十、Servlet ——

一、 web开发概述 所谓web开发,指的是从网页中向后端程序发送请求,与后端程序进行交互,流程如下: ● 什么是服务器? Web服务器是指驻留于因特网上某种类型计算机的程序,它可以向浏览器等Web客户端提供文档,也可以放置…

算法的学习笔记—反转链表(牛客JZ24)

😀前言 在算法面试中,链表问题是一个常见的考点,而反转链表更是其中的经典题目之一。本篇文章将通过具体的代码实现和思路解析,带你深入理解反转链表的解法。 🏠个人主页:尘觉主页 文章目录 😀反…

【前端】NodeJS:项目上线

文章目录 1 项目上线1.1 搭建本地仓库1.1.1 初始化仓库1.1.2 全局忽略1.1.3 提交 1.2 连接远程仓库1.2.1 新建仓库1.2.2 复制地址1.2.3 添加远程存储库 1.3 发布项目 2 配置HTTPS证书2.1 HTTPS2.2 操作流程: 1 项目上线 1.1 搭建本地仓库 1.1.1 初始化仓库 1.1.2 全局忽略 1.…

福泰轴承股份有限公司进销存系统pf

TOC springboot413福泰轴承股份有限公司进销存系统pf 绪论 1.1 研究背景 现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利化&#…

Idea里配置Maven版本

一、安装Maven 1. 官网下载maven地址: Maven – Download Apache Maven Binary是可执行版本,已经编译好可以直接使用。 Source是源代码版本,需要自己编译成可执行软件才可使用。tar.gz和zip两种压缩格式,其实这两个压缩文件里面包含的内容是…

AWS域名注册服务:为您的在线业务打下坚实基础

在如今的数字时代,域名是每个在线业务的基础。一个好的域名不仅可以提升品牌形象,还能为用户提供便捷的访问体验。亚马逊网络服务(AWS)提供了强大的域名注册服务,帮助企业轻松获取和管理域名。我们九河云将深入探讨AWS…

Spring:IOC的详解☞Bean的实例化、Bean的生命周期

1、Bean基础配置 bean的基础配置&#xff1a; <bean id"" class""/> Bean的别名&#xff1a;name属性 Bean的作用范围&#xff1a;scope配置 使用bean的scope属性可以控制bean的创建是否为单例&#xff1a; singleton 默认为单例prototype 为非单…