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

news2024/10/9 11:37:08

前言

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

目录

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.coloradmin.cn/o/2198910.html

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

相关文章

下一代电源管理:Modern Standby与S3睡眠的对比

Modern Standby与S3睡眠的对比 一、引言二、Modern Standby概述三、S3睡眠模式概述四、Modern Standby与S3睡眠的差异五、实际应用和适用场景六、测试Modern Standby的性能6.1、PowerCfg命令行工具6.2、Windows Performance Toolkit 七、总结 一、引言 电源管理在现代计算设备…

Midjourney中文版:解锁你的创意之旅

在创意与技术的交汇点,Midjourney中文版正等待着每一位热爱艺术、渴望表达的灵魂。这不仅仅是一款AI绘画工具,更是一个激发无限灵感、让创意自由翱翔的奇妙平台。 Midjourney AI超强绘画 (原生态系统)用户端:Ai Loadinghttps://w…

Linux操作系统——软件包的管理(实验报告)

实验——软件安装的基本操作 一、实验目的 熟悉软件安装流程,掌握java的安装流程,熟悉相关命令的操作。 二、实验环境 硬件:PC电脑一台,网络正常; 配置:win10系统,内存大于8G 硬盘500G及以上…

机器学习实战27-基于双向长短期记忆网络 BiLSTM 的黄金价格模型研究

大家好,我是微学AI,今天给大家介绍一下机器学习实战27-基于双向长短期记忆网络 BiLSTM 的黄金价格模型研究。本文针对黄金价格预测问题,展开基于改造后的长短期记忆网络BiLSTM的黄金价格模型研究。文章首先介绍了项目背景,随后详细…

LSTM的变体

一、GRU 1、什么是GRU 门控循环单元(GRU)是一种循环神经网络(RNN)的变体,它通过引入门控机制来控制信息的流动,从而有效地解决了传统RNN中的梯度消失问题。GRU由Cho等人在2014年提出,它简化了…

判断回文 python

题目&#xff1a; 输入一个四位数&#xff0c;判断该数是否为回文数&#xff0c;回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数&#xff0c;比如1221。 代码法1&#xff1a; ninput() nint(n) if n<1000 or n&g…

微积分复习笔记 Calculus Volume 1 - 2.2 The Limit of a Function

2.2 The Limit of a Function - Calculus Volume 1 | OpenStax

中控自动化测试实战和实车智能驾驶业务解析

一.中控自动化测试流程及环境搭建 1.中控自动化测试流程 2.中控自动化测试环境的搭建 1.JDK环境配置 安装 Java安装包.生成java\bin jre\bin JAVA_HOME: java目录 c:\java path:%JAVA_HOME%\bin jre\bin 为了后面appium server GUI客户端中的环境配置 2.SDK 配置 pal…

怎么编辑图片?这5款工具教你快速编辑

怎么编辑图片&#xff1f;编辑图片是一项既具创意又实用的技能&#xff0c;它不仅能够提升图片的视觉效果&#xff0c;增强信息的传达力&#xff0c;还能激发无限的创作灵感。通过编辑图片&#xff0c;我们可以轻松调整色彩、添加文字、裁剪构图&#xff0c;甚至创造出令人惊叹…

Oxygen Forensic Detective 17.0 发布,新增功能概览

Oxygen Forensic Detective 17.0 发布&#xff0c;新增功能概览 Oxygen Forensic Detective Windows 17 Multilingual - 领先的一体化数字取证软件 digital forensic software 请访问原文链接&#xff1a;https://sysin.org/blog/oxygen-forensic-detective/&#xff0c;查看…

【学习笔记】SquareLine Studio安装教程(LVGL官方工具)

一.简介与导航&#xff1a; SquareLine Studio是由LVGL官方开发的一款UI设计工具&#xff0c;采用图形化进行界面UI设计&#xff0c;轻易上手。 SquareLine Studio官方网址&#xff1a;https://squareline.io/SquareLine Studio官方文档&#xff1a;https://docs.squareline.io…

车牌检测系统源码分享

车牌检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision 研究…

3、Docker搭建MQTT及Spring Boot 3.x集成MQTT

一、前言 本篇主要是围绕着两个点&#xff0c;1、Docker 搭建单机版本 MQTT&#xff08;EMQX&#xff09;&#xff0c;2、Spring Boot 3.x 集成 MQTT&#xff08;EMQX&#xff09;&#xff1b; 而且这里的 MQTT&#xff08;EMQX&#xff09;的搭建也只是一个简单的过程&#x…

为什么现在的大学生很难真正学好LabVIEW编程?

学习LabVIEW编程对大学生来说可能存在以下挑战&#xff1a; 学习曲线陡峭&#xff1a;尽管LabVIEW提供直观的图形化编程环境&#xff0c;便于初学者入门&#xff0c;但要深入掌握其高级功能和复杂应用&#xff0c;仍需要投入大量时间和精力。随着学习的深入&#xff0c;概念和应…

CAN与CANFD的区别

CAN概念&#xff1a; CAN&#xff0c;全称为Controller Area Network&#xff0c;即控制器局域网络&#xff0c;是一种用于汽车电子系统中的串行通信协议。它由德国电气工程师协会&#xff08;Bosch&#xff09;在1983年开发&#xff0c;并在1986年正式推出。CAN协议主要用于汽…

牛客:Holding Two,Inverse Pair,Counting Triangles

Holding Two 题目描述 登录—专业IT笔试面试备考平台_牛客网 ​​运行代码 #include<bits/stdc.h> using namespace std; const int N3e45; string s1,s2; int main(){int n,m;cin>>n>>m;for(int i0;i<m;i){if(i&1){s10;s21;} else{s11;s20;} }fo…

架构师:Spring Cloud Gateway 的技术指南

1、简述 Spring Cloud Gateway 是 Spring Cloud 生态系统中的一个重要组件,作为微服务架构的 API 网关,它为路由、限流、安全、监控等功能提供了全面支持。相比传统的 Zuul 网关,Spring Cloud Gateway 使用了非阻塞的 WebFlux 框架,性能上有了显著提升,并且提供了更现代化…

BLE MESH学习2——自定义MESH网络架构思考

BLE MESH学习2——自定义MESH网络架构思考 基于对WCH CH582这款单片机的了解&#xff0c;其可以实现mesh配网、朋友节点、低功耗节点和中继节点的角色&#xff0c;基本功能无问题。在此基础上&#xff0c;考虑满足IoT需求的MESH架构设计&#xff0c;作为后续设计的“白皮书”。…

构建流媒体管道:利用 Docker 部署 Nginx-RTMP 从 FFmpeg RTMP 推流到 HLS 播放的完整流程

最近要实现一个类似导播台的功能&#xff0c;于是我先用 FFmpeg 实现一个参考对照的 Demo&#xff0c;我将其整理为一篇文章&#xff0c;方便后续大家或者和自己参考&#xff01; 1、软件工具介绍 本次部署相关软件 / 工具如下&#xff1a; FFmpeg&#xff1a;全称是 Fast Fo…

java脚手架系列1--模块化、多环境

之所以想写这一系列&#xff0c;是因为之前工作过程中有几次项目是从零开始搭建的&#xff0c;而且项目涉及的内容还不少。在这过程中&#xff0c;遇到了很多棘手的非业务问题&#xff0c;在不断实践过程中慢慢积累出一些基本的实践经验&#xff0c;认为这些与业务无关的基本的…