后端存储实战课总结(上)

news2024/10/6 6:42:10

创建和更新订单

表设计

最少应该有以下几张表:

  1. 订单主表:保存订单基本信息
  2. 订单商品表:保存订单中的商品信息
  3. 订单支付表:保存订单支付和退款信息
  4. 订单优惠表:保存订单的优惠信息

订单主表和字表是一对多关系,关联的外键是订单主表的主键(订单号)。

幂等性

可能出现重复下单的场景:一种是就是用户多点了,另外就是网络错误导致(RPC、网关的重试机制)

解决方案:通过一个专门生成全局唯一订单号的服务,插入数据的时候将其保存

ABA 问题

更新订单相关信息的时候可能出现。

解决方案:在表中加个时间戳或者版本的字段,每次查询的时候将其返回,更新的时候要比较下当前订单数据的版本号,是否和预期的一致。不一致直接拒绝更新,一致的话在一个事务中更新数据的同时将版本号+1。

商品详情页

问题

一是高并发,商品的详情页每天都会有很高的 DAU(日均访问次数)。

二是商品数据规模的问题,比如下图中要存储的:后端存储实战课

方案

基本信息相对来说比较固定,可以在数据库中建表存储,也要提供缓存(比如 Redis、Memcached)帮助系统抗一些读请求。另外要注意的是,要保留商品的历史版本,因为订单中关联的商品数据必须是下单哪个时刻的商品数据,可以用一张历史表来保存。

商品参数指商品特征,比如内存大小、屏幕尺寸、口红色号等,和基本属性一样,是结构化的数据,但是不同类型的商品参数也是不一样的。对于属性不固定的数据来说,可以使用 MongoDB 来存储,因为 MongoDB 没有数据表要有固定结构的要求。

MongoDB 中的每一行数据,在存储层就是简单地被转化成 BSON 格式后存起来,这个 BSON 就是一种更紧凑的 JSON。所以,即使在同一张表里面,它每一行数据的结构都可以是不一样的。当然,这样的灵活性也是有代价的,MongoDB 不支持 SQL,多表联查和复杂事务比较孱弱,不太适合存储一般的数据。

图片和视频由于占用空间比较大,一般的存储方式是在数据库中只保留图片视频的 id 或者 url,实际的图片视频以文件方式存储,可以保存在对象存储(Object Storage)中。

对象存储可以简单理解为无限容量的大文件 KV 存储,key 是唯一的,对象是 value,可以通过 key 操作 value(写入、访问、删除)。对象存储提供了客户端 API,可以在 Web 页面或者 app 中直接访问,而不用通过后端服务。页面通过提供的 URL 直接访问,省事不占带宽,同时,对象存储云服务也提供了自带 CDN(Content Delivery Network)服务,响应时间比直接请求业务服务器更短。云服务厂商还会提供针对性优化,比如说缩放和转码服务。

商品介绍在商详页中占得比重是最大的,包含了大量的带格式文字、图片和视频。其中图片和视频自然要存放在对象存储里面,商品介绍的文本,一般都是随着商详页一起静态化,保存在 HTML 文件中。

静态化是相对于动态页面来说的。一般我们部署到 Tomcat 中的 Web 系统,返回的都是动态页面,也就是在 Web 请求时,动态生成的。比如说商详页,一个 Web 请求过来,带着 SKUID,Tomcat 中的商详页模块,再去访问各种数据库、调用后端服务,动态把这个商详页拼出来,返回给浏览器。
商详页的绝大部分内容都是商品介绍,它是不怎么变的。那不如就把这个页面事先生成好,保存成一个静态的 HTML,访问商详页的时候,直接返回这个 HTML。这就是静态化。
商详页静态化之后,不仅仅是可以节省服务器资源,还可以利用 CDN 加速,把商详页放到离用户最近的 CDN 服务器上,让商详页访问更快。
至于商品价格、促销信息等这些需要频繁变动的信息,不能静态化到页面中,可以在前端页面使用 AJAX 请求商品系统动态获取。这样就兼顾了静态化带来的优势,也能解决商品价格等信息需要实时更新的问题。

购物车

场景

  1. 未登录,浏览器加购,关闭浏览器再打开,加购商品应该存在
  2. 未登录,浏览器加购,然后登录,加购的物品存在
  3. 登录后再注销,关闭浏览器,步骤 2 中加购的商品不登录看不到(未登录特定账号看到的购物车是空的)
  4. 手机登录,步骤 2 中的加购的存在

原则

用户未登录,需要临时暂存购物车中的商品;

用户登录,将暂存购物车的商品加入到用户购物车,清空暂存购物车;

用户登录后,各端同步用户购物车。

设计

暂存购物车

如果存在服务端,需要唯一标识存储,浪费服务端资源,故需要存储在客户端。

存在客户端的途径:SESSION 不合适(时间短,SESSION 数据其实还是在服务端);Cookie 存储的话,实现简单,通过服务端读写 Cookie 实现具体的加减购物车合并购物车逻辑;LocalStorage 存储的话,实现复杂(客户端和服务端都需要实现逻辑),但是容量大,不用每次请求都携带,节省带宽。

用户购物车

还是推荐 MySQL,如果用 Redis 存在丢数据的情况,查询方式和事务都不如 MySQL。

引入 Redis 需考虑问题:

  1. 不同用户不同购物车,缓存命中率不高,为了维护缓存,还提高了系统复杂度,有没有必要
  2. Redis 的缓存更新策略

账户系统

目的

对账系统存在的目的:来核对、矫正账户系统和其他系统之间的数据差异。

每个账户系统都不是孤立存在的,至少要和财务、订单、交易这些系统有着密切的关联。理想情况下,账户系统内的数据应该是自洽的。所有用户的账户余额加起来,应该等于这个电商公司在银行专用账户的总余额。账户系统的数据也应该和其他系统的数据能对的上。比如说,每个用户的余额应该能和交易系统中充值记录,以及订单系统中的订单对的上。

记录流水,可以修改由于系统 bug 或者认为篡改导致的账户余额的问题。流水的数据模型至少要包含:流水 ID、交易金额、交易时间戳、交易双方的系统、账户、交易单号等信息。

原则

  1. 流水记录只能新增,一旦记录成功不允许修改和删除。即使是由于正当原因需要取消一笔已经完成的交易,也不应该去删除交易流水。正确的做法是再记录一笔“取消交易”的流水。
  2. 流水号必须是递增的,我们需要用流水号来确定交易的先后顺序。

在对账的时候,一旦出现了流水和余额不一致,并且无法通过业务手段来确定到底是哪儿记错了的情况,一般的处理原则是以交易流水为准来修正余额数据,这样才能保证后续的交易能“对上账”。

方案

首先要保证只有记录流水的时候更新余额,不可以将更新余额单独提供;其次使用数据库事务,记录流水和修改余额两个操作要么都成功,要么都失败。

MySQL 事务和 ACID 相关内容不在此赘述

分布式事务

背景

分布式环境下跨系统数据一致性问题。

方案

2PC、3PC、TCC、Saga、本地消息表都是分布式事务的解决方案

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

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

相关文章

android Framework 中用到了哪些跨进程通信方式?

文章目录Linux 有哪些跨进程的通信方式?管道本地 Socket共享内存信号Linux 有哪些跨进程的通信方式? Binder 机制是Android基于Linux的一种独特的IPC机制。我们常用的AMS,PMS 等都是通过Binder机制来完成跨进程通信的,那么除了Bin…

维格云连接功能日志入门教程

目录 维格云连接功能简介 维格云连接功能效果 涉及功能范围 注意事项 维格云连接功能简介 应用内「数据管理——概览」界面,新增了连接功能日志模块,便于查看连接功能的执行结果、排查问题。 维格云连接功能效果 鼠标移动至目标日志,点击“查看数据”可以跳转至对应数据…

求树的直径算法以及证明

以下为两次dfs(bfs)的做法以及正确性证明。 算法步骤 (1)任取树上一点S,以S为源点BFS得S到各个顶点的d值; (2)取d值最大者之一为P,再以P为源点BFS得P到各个顶点的d值&am…

Metabase学习教程:仪表盘-7

使用Metabase构建记录查找工具 如何使用Metabase构建内部查找工具来快速查找有关客户、订单或其他数据的详细信息。 我们写过人们使用Metabase的一些有趣的方式其中之一是使用Metabase作为内部或后台应用程序的解决方案,例如客户查找工具。您不必构建定制页面来查…

惠普笔记本重装系统后没有声音如何解决

​最近很多小伙伴又开始了网上冲浪的生活,但是电脑用久了难免会发生一些故障的问题,最近就有些小伙伴重装系统之后问小编自己的电脑没有声音的问题?不要慌?接下来小编教你惠普笔记本重装系统后没有声音的解决方法. 工具/原料: 系统版本:win7系统 型…

基于单片机技术的自动停车器的设计

目 录 摘 要 I Abstract II 1绪论 1 1.1课题研究背景 1 1.2国内外发展现状 1 1.3汽车自动停车器的研究目的 2 1.4课题研究的意义 2 2汽车停车器的功能设计 3 2.1汽车自动停车器的设计要求 3 2.2停车器的主要功能 3 3汽车自动停车器的硬件设计 5 3.1汽车自动停车器的硬件组成 5 …

简单的 JSONParser

最近在学习 Python 的正则表达式内容,我看的是官方的文档,在文档的最后有一个例子,勾起了我的兴趣。它是用正则表达式来制作了一个简单的词法分析器。我觉得这个东西非常有趣,以前在学校的时候,有一次作业我是手写的&a…

开源?Highcharts JS 10.3.2 | Highcharts Javascript

Highsoft 是 Highcharts Javascript 图表库及其同类产品 Highcharts Stock、Highcharts Maps 和 Highcharts Gantt 背后的公司。 Highcharts 是一个多平台图表库,它使开发人员可以轻松地将交互式图表添加到任何规模的 Web 和移动项目中。 世界上最大的 100 家公司中…

36氪专访融云CEO董晗:8年企服,6年出海,现计划成为「沙特最大科技企业」

⬆️关注文章公众号文章报名融云&艾瑞“政企数智办公研究报告及新品发布会” 若从 2001 年中国加入 WTO 算起,中国企业走向海外的进程已经持续了二十余年。但由于行业起步较晚,国内企服领域的全球化,直到今年才渐成趋势。关注【融云全球互…

aws cloudformation 理解宏的使用

资料 使用 AWS CloudFormation 宏对模板执行自定义处理Macros Examples使用 AWS Lambda 支持的宏扩展 AWS CloudFormation 宏的理解 在cfn模板的创建过程中,我们会使用内置函数和伪函数对配置参数进行进一步处理,避免冗长的写法,更灵活的配…

西门子精彩触摸屏SMART V3组态报警的具体方法示例

西门子精彩触摸屏SMART V3组态报警的具体方法示例 用户自定义报警分为离散量报警和模拟量报警。 离散量报警:离散量对应于二进制数的1位,离散量的两种相反状态可以用1位二进制数的0、1状态来表示。例如:电动机的交流接触器的接通和断开、各种故障信号的出现和消失,都可以用…

建模助手:Revit中梁注释设置表达相对净高

一、Revit中梁注释设置表达相对净高 当我们利用 Revit 软件做管综的时候,需要明确与结构体的相对位置关系,下面我们就用“梁标记”的方式来做一下标记,在平面图上表达一下相对净高。如下图: 这样的平面梁标注是如何做上去的呢? 首…

获取网络时间、解析xml、截取string

很多游戏具有每日登陆奖励功能,为防止玩家修改本地时间,需要读取服务器时间。下面分两部分介绍获取网络时间的两种方法,第一部分解析xml,第二部分截取string。 第一部分:通过国家授时中心链接获得的数据如下: 获取网络…

互联网+医疗解决方案

国家“互联网”行动指导意见,明确“互联网医疗健康”行动路线。 制定“互联网”行动计划,推动移动互联网、云计算、大数据、物联网等与现代制造业结合,促进电子商务、工业互联网和互联网金融健康发展,引导互联网企业拓展国际市场…

麒麟信安携手河南IT联盟召开 《麒麟信安信创应用解决方案》线上分享会

在党政及金融、交通、能源等重要行业的信创应用步伐逐步加快的背景下,各行业均面临着不同程度的国产化落地难题。11月29日下午,麒麟信安与河南省信息协会IT产业分会(河南IT联盟)携手召开《麒麟信安信创应用解决方案》线上分享会&a…

微信小程序| 做一款可以计算亲戚关系的计算器

📌个人主页:个人主页 ​🧀 推荐专栏:小程序开发成神之路 --【这是一个为想要入门和进阶小程序开发专门开启的精品专栏!从个人到商业的全套开发教程,实打实的干货分享,确定不来看看? …

Spring(Spring的理解+DI+Spring的创建)

目录 1. Spring 是什么 2. DI 3. 面试题: IoC 和 DI 有什么区别? 4. Spring 的创建 5. 将 Bean (对象) 存储到 Spring (容器) 中 6. 将 Bean (对象) 从 Spring (容器) 中取出来 7. 面试题: ApplicationContext 和 BeanFactory的区别 8. getBean 更多用法 1. Spring 是…

能否在虚拟平台里构建真实的生活体验?

接近三年的疫情,重构了每一个人的生活。线下活动的频繁延期、取消,使得物理空间的聚集充满了不确定性,线上办公、网络授课等远程协同的方式在这样的时代背景下,毫无疑问成了主旋律。曾经只停留在想象层面的不出门就能完成工作、上…

u盘打不开常见原因|数据恢复方法|解决方案

u盘作为一种常用的外部存储器,能够帮助我们存放大量的数据,如图片、文档、视频等文件类型。但是在使用过程中,难免会遇到这样或那样的问题,比如使用过程中出现u盘打不开的情况,但是里面又有自己重要的文件,…

数字图像处理(入门篇)一 图像的数字化与表示

目录 1 人眼图像是如何形成的? 2 图像的感知与获取? 3 图像的数字化 4 数字图像的表示 1 人眼图像是如何形成的? 人眼近似为一个球体,物体的光线经过角膜和晶状体的折射,在视网膜上形成“倒立缩小”的实像。 视网膜…