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

前言

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

目录

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已经足够灵活的情况下&…

【分布式微服务云原生】 RPC协议:超越HTTP的远程通信艺术

目录 RPC协议:超越HTTP的远程通信艺术引言RPC协议的实现方式RPC的核心机制流程图:RPC通信流程表格:不同RPC实现方式的比较结论呼吁行动Excel表格:RPC协议实现方式总结 RPC协议:超越HTTP的远程通信艺术 摘要 RPC&#…

pdsh:一个用于并行执行命令的工具

pdsh(Parallel Distributed Shell)是一个用于并行执行命令的工具,可以在多个远程主机上同时运行相同的命令。它对于需要在多台服务器上执行批量操作的系统管理员和开发人员非常有用。 pdsh 介绍 主要特性 并行执行: pdsh 可以在…

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

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

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

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

mysql学习教程,从入门到精通,SQL 表、列别名(Aliases)(30)

1、SQL 表、列别名(Aliases) 在SQL中,表别名(Table Aliases)和列别名(Column Aliases)是两种非常有用的技术,可以使查询语句更加简洁和易读。它们还可以帮助处理复杂的查询&#xf…

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

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

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

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

第18场小白入门赛(蓝桥杯)

第 18 场 小白入门赛 6 武功秘籍 考察进制理解。 对于第 i i i 位,设 b i t i x bit_ix biti​x ,每一位的最大值是 b j b_j bj​ ,也就是说每一位是 b j 1 b_j1 bj​1 进制 ,那么第 i i i 位的大小就是 x ∑ j i 1…

AI学习指南深度学习篇-生成对抗网络在深度学习中的应用

AI学习指南深度学习篇-生成对抗网络在深度学习中的应用 生成对抗网络(GANs)自2014年提出以来,已经成为深度学习领域的一种重要技术。它为图像生成、图像编辑、风格迁移和生成对抗防御等领域带来了革命性的变化。本文将深入探讨这些应用&…

代码训练营 day28|LeetCode 39,LeetCode 40,LeetCode 131

前言 这里记录一下陈菜菜的刷题记录,主要应对25秋招、春招 个人背景 211CS本CUHK计算机相关硕,一年车企软件开发经验 代码能力:有待提高 常用语言:C 系列文章目录 第28天 :第七章 回溯算法part02 文章目录 前言系列…

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

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

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

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

《重庆师范大学学报(自然科学版)》

《重庆师范大学学报(自然科学版)》主要刊登数学、物理学、计算机科学、化学、生物学、地理学等方面的学术文章。重点栏目有“运筹学与控制论”、“动物科学”和“三峡地区资源环境生态研究”;一般栏目有“理论与应用研究”和“研究快讯”等。…

Google Earth Engine:如何利用将海岸线进行偏移(shoreline-raster-chip数据为例)

目录 简介 数据 函数 gradient() Arguments: Returns: Image displace(displacement, mode, maxOffset) Arguments: Returns: Image 代码 结果 简介 如何利用将海岸线进行偏移(shoreline-raster-chip数据为例) 数据 sample-shoreline-raster-chip是一个用于沿海…

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)结合使…

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

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