【业务场景】最全的购物车设计与实现

前言

博主最近在做一个购物商城,正好设计到购物车模块,于是乎全面的来聊一聊购物车模块实现的一些核心要点吧,很值得反复品味的设计,当需要实现购物车的时候,本文应该拿来就能用。

目录

1.需要解决的核心问题清单

2.购物车的存储

3.如何进行实时更新与促销

4.商品的失效和排序

5.加车前的校验

6.结算时的数据一致性与吞吐量的考量

7.redis中的存储数据结构

8.大key、热key问题


1.需要解决的核心问题清单

  • 购物车的存储

  • 购物车中的商品如何进行实时更新

  • 购物车中的商品如何参加促销

  • 购物车的商品如何进行失效

  • 加入购物车前的校验

  • 结算时的数据一致性与吞吐量的考量

  • 数据的存储结构

  • 大key、热key问题

2.购物车的存储

购物车里存什么数据?存在哪里?

  • 首先明确购物车中存商品的副本数据,还是存ID?应该是存ID,因为存副本不好进行状态的关联与更新,而且数据的大小也大

  • 需要的可靠性高,就存在磁盘中,需要的可靠性没那么高,就可以考虑存在内存中。很明显购物车的数据可靠性并不需要很高,放在内存中即可。

  • 购物车的数据变化比较频繁,也就是读写操作比较频繁,如果进行落库的话,很明显代价太大了。基于这一点也应该将数据放在内存中

  • 内存开起持久化,这样即使内存崩了,也不至于导致购物车全崩,用户大不了重新添加一下购物车,代价也是可以接受的。

3.如何进行实时更新与促销

购物车中存的是商品的ID,所以商品属性是能进行实时更新的,但是还有一些添加到购物车中的商品开起促销该怎么处理?

假如把商品A放入到购物车中一直没下单,不久后商品A开启了促销:10个库存中拿出5个来进行打折售卖。

很明显提前就加入购物车的用户对于才参加活动需要手动去抢,去选择商品+下单的用户来说是不公平的,所以对于在促销开始之前就加入了购物车的商品,不能参与促销活动。

如何实现?

实现方式:

  • 所有购物车中的该商品均失效,很明显这是一个代价很高的方案,操作成本太大。

  • 商品属性中追加一个销售类型用来区分销售策略,是正常销售还是促销

4.商品的失效和排序

商品失效是指因为商家下架了商品,导致购物车中的商品失效,失效的商品无法进行结算。由于购物车中存储的是商品ID,所以商品的状态是实时同步的,这一点在打开购物车的时候进行联合查询即可。

排序的话根据时间维度进行降序排序即可。

5.加车前的校验

在添加商品到购物车的时候肯定要进行校验能否添加到购物车,比如这个账户被拉黑了或者其它原因,原因是多种多样的,校验规则也是多变的,所以在进行校验时要注意考虑不到可扩展性,一般用:

  • 门面模式+工厂模式

  • 责任链模式

来实现可扩展的校验代码。

6.结算时的数据一致性与吞吐量的考量

购物车的结算流程如下:

结算时肯定是要求数据一致性的,避免产生超卖等异常库存扣减的情况出现。要保证一致性肯定是要锁数据的,至于怎么锁就要分情况了。

  • 系统的吞吐量要求不高时,锁全流程,到生成订单完后再释放锁。

  • 系统的吞吐量要求高时,就要细化锁的粒度了,细化到需要强一致性的最小单元。

结算时需要强一致性的最小单元是:付款+扣库存,生成订单都可以稍后来做。然后再衡量一下是这个吞吐量有多高,一般高的话,不增加系统的复杂性,考虑用异步任务即可(诸如JDK自带的任务编排类Completablefuture),要是很高的话,就考虑引入一个MQ中间层来做流量削峰了:

7.redis中的存储数据结构

用hash去存购物车

//key值
uid
//value值
//商品列表
items:[{product_id一些基础属性(sku)
},
......
]

8.大key、热key问题

购物车中是不太会存在热key问题的,毕竟是每个用户看自己购物车,有权限隔离的。但是大key问题是很容易遇见的,只要购物车里的商品够多,就会变成一个大key。

大key会影响两个方面:

  • 读value值,速度会慢,这个可以通过分页来解决

  • 浪费内存空间,这个没办法,数据就是要存,也没办法

所以综上所述购物车场景中会遇见大key问题,但是也无需去解决。

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

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

相关文章

Mybatis-plus做了什么

Mybatis-plus做了什么 Mybatis回顾以前的方案Mybatis-plus 合集总览:Mybatis框架梳理 聊一下mybatis-plus。你是否有过疑问,Mybatis-plus中BaseMapper方法对应的SQL在哪里?它为啥会被越来越多人接受。在Mybatis已经足够灵活的情况下&…

22.第二阶段x86游戏实战2-背包遍历REP指令详解

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…

【Java 并发编程】多线程安全问题(上)

前言 虽然并发编程让我们的 CPU 核心能够得到充分的使用,程序运行效率更高效。但是也会引发一些问题。比如当进程中有多个并发线程进入一个重要数据的代码块时,在修改数据的过程中,很有可能引发线程安全问题,从而造成数据异常。 p…

免费 Oracle 各版本 离线帮助使用和介绍

文章目录 Oracle 各版本 离线帮助使用和介绍概要在线帮助下载离线文档包:解压离线文档:访问离线文档:导航使用:目录介绍Install and Upgrade(安装和升级):Administration(管理&#…

做无货源反向代购业务需要的代购系统功能需求讲解(一):商品数据接入

在电子商务领域,无货源反向代购业务逐渐崭露头角,成为许多创业者和中小企业拓展市场的新途径。这种业务模式的核心在于通过代购平台,将国外或特定地区的商品信息展示给国内消费者,并在消费者下单后,由代购方进行采购、…

成都睿明智科技有限公司真实可靠吗?

在这个日新月异的电商时代,抖音作为短视频与直播电商的佼佼者,正以前所未有的速度重塑着消费者的购物习惯。而在这片充满机遇与挑战的蓝海中,成都睿明智科技有限公司以其独到的眼光和专业的服务,成为了众多商家信赖的合作伙伴。今…

【万字长文】Word2Vec计算详解(一)

【万字长文】Word2Vec计算详解(一) 写在前面 本文用于记录本人学习NLP过程中,学习Word2Vec部分时的详细过程,本文与本人写的其他文章一样,旨在给出Word2Vec模型中的详细计算过程,包括每个模块的计算过程&a…

Ubuntu-24.10无法安装Sunlogin-15.2的解决方案

目录 1. 报错信息2. 解决方案3. dpkg-deb命令帮助4. References 1. 报错信息 albertqeeZBG7W:/opt/albertqee/Downloads$ ls | egrep -i sun SunloginClient_11.0.1.44968_amd64.deb SunloginClient_15.2.0.63062_amd64.deb SunloginClient_15.2.0.63064_amd64.deb albertqeeZ…

JavaScript函数基础(通俗易懂篇)

10.函数 10.1 函数的基础知识 为什么会有函数? 在写代码的时候,有一些常用的代码需要书写很多次,如果直接复制粘贴的话,会造成大量的代码冗余; 函数可以封装一段重复的javascript代码,它只需要声明一次&a…

在虚拟机里试用了几个linux操作系统

在虚拟机里试用了几个操作系统。遇到一些问题。虚拟机有时候出错。有时候出现死机现象,有的不能播放视频。有的显示效果不太好。 试了debian12,ubuntu20.4,ubuntu22.4,ubuntu24.4,deepin。其中ubuntu20.4使用时没有出…

Jenkins打包,发布,部署

一、概念 Jenkins是一个开源的持续集成工具,主要用于自动构建和测试软件项目,以及监控外部任务的运行。与版本管理工具(如SVN,GIT)和构建工具(如Maven,Ant,Gradle)结合使…

武汉正向科技|无人值守起重机,采用格雷母线定位系统,扎根智能制造工业

武汉正向科技开发的无人值守起重机系统在原起重机系统的基础上,利用格雷母线位置检测技术,信息技术,网络技术及传感器技术为起重机系统添加管理层,控制层和基础层。实现起重机智能化,无人化作业的库区综合管理系统。 正…

【数据结构 | PTA】栈

文章目录 7-1 汉诺塔的非递归实现7-2 出栈序列的合法性**7-3 简单计算器**7-4 盲盒包装流水线 7-1 汉诺塔的非递归实现 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记…

DAY27||回溯算法基础 | 77.组合| 216.组合总和Ⅲ | 17.电话号码的字母组合

回溯算法基础知识 一种效率不高的暴力搜索法。本质是穷举。有些问题能穷举出来就不错了。 回溯算法解决的问题有: 组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数…

力扣之603.连续空余座位

文章目录 1. 603.连续空余座位1.1 题干1.2 准备数据1.3 思路分析1.4 解法1.5 结果截图 1. 603.连续空余座位 1.1 题干 表: Cinema ----------------- | Column Name | Type | ----------------- | seat_id | int | | free | bool | ----------------- Seat_id 是该表的自动递…

Chromium 搜索引擎功能浅析c++

地址栏输入:chrome://settings/searchEngines 可以看到 有百度等数据源,那么如何调整其顺序呢,此数据又存储在哪里呢? 1、浏览器初始化搜索引擎数据来源在 components\search_engines\prepopulated_engines.json // Copyright …

CSS圆角

在制作网页的过程中,有时我们可能需要实现圆角的效果,以前的做法是通过切图(将设计稿切成便于制作成页面的图片),使用多个背景图像来实现圆角。在 CSS3 出现之后就不需要这么麻烦了,CSS3 中提供了一系列属性…

【C++】map详解

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

python爬虫 - 进阶requests模块

🌈个人主页:https://blog.csdn.net/2401_86688088?typeblog 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、SSL证书问题 (一)跳过 SSL 证书验证 &#xff0…

Linux驱动学习——内核编译

1、从官网下载适合板子的Linux内核版本 选择什么版本的内核需要根据所使用的硬件平台而定,最好使用硬件厂商推荐使用的版本 https://www.kernel.org/pub/linux/kernel/ 2、将压缩包复制到Ubuntu内进行解压 sudo tar -xvf linux-2.6.32.2-mini2440-20150709.tgz 然…