本周系统设计复习:
- 数据库锁有什么区别?
- 我们如何在 API 设计中执行分页?
- MVC、MVP、MVVM、MVVM-C 和 VIPER 架构模式有什么区别?
- 当你在浏览器中输入 URL 时会发生什么?
- 如何通过扫描 QR 码从数字钱包(如 Paypal、Venmo、Paytm)支付?
数据库锁的类型
在数据库管理中,锁是防止并发访问数据以确保数据完整性和一致性的机制。
以下是数据库中使用的常见锁类型:
1. 共享锁(S Lock)
它允许多个事务同时读取资源但不修改它。其他事务也可以在同一资源上获取共享锁。
2. 排他锁(X Lock)
它允许事务读取和修改资源。当持有排他锁时,其他事务不能在同一资源上获取任何类型的锁。
3. 更新锁(U Lock)
用于防止当事务打算更新资源时的死锁场景。
4. 模式锁(Schema Lock)
用于保护数据库对象的结构。
5. 批量更新锁(BU Lock)
在批量插入操作期间使用,通过减少所需锁的数量提高性能。
6. 键范围锁(Key-Range Lock)
在索引数据中使用,防止幻读(将新行插入事务已读取的范围)。
7. 行级锁(Row-Level Lock)
锁定表中的特定行,允许并发访问其他行。
8. 页级锁(Page-Level Lock)
锁定数据库中的特定页(固定大小的数据块)。
9. 表级锁(Table-Level Lock)
锁定整个表。这实现简单但会显著减少并发性。
API 设计中的分页技术
分页在 API 设计中至关重要,以有效处理大数据集并提高性能。以下是六种流行的分页技术:
1. 基于偏移的分页(Offset-based Pagination)
此技术使用偏移和限制参数定义起始点和返回的记录数。
- 示例:
GET /orders?offset=0&limit=3 - 优点:实现和理解简单
- 缺点:对大偏移可能变得低效,因为它需要扫描和跳过行
2. 基于游标的分页(Cursor-based Pagination)
此技术使用游标(唯一标识符)标记数据集中的位置。通常,游标是指向特定记录的编码字符串。
- 示例:
GET /orders?cursor=xxx - 优点:对大数据集更高效,因为它不需要扫描跳过的记录
- 缺点:实现和理解稍复杂
3. 基于页的分页(Page-based Pagination)
此技术指定页码和每页的大小。
- 示例:
GET /items?page=2&size=3 - 优点:实现和使用简单
- 缺点:与大页码类似基于偏移的分页的性能问题
4. 基于键集的分页(Keyset-based Pagination)
此技术使用键过滤数据集,通常是主键或其他索引列。
- 示例:
GET /items?after_id=102&limit=3 - 优点:对大数据集高效,避免大偏移的性能问题
- 缺点:需要唯一和索引的键,实现可能复杂
5. 基于时间的分页(Time-based Pagination)
此技术使用时间戳或日期分页记录。
- 示例:
GET /items?start_time=xxx&end_time=yyy - 优点:对按时间排序的数据集有用,确保如果添加新记录不会错过任何记录
- 缺点:需要可靠和一致的时间戳
6. 混合分页(Hybrid Pagination)
此技术结合多种分页技术以利用它们的优势。
- 示例:结合游标和基于时间的分页以高效滚动时间排序记录
- 示例:
GET /items?cursor=abc&start_time=xxx&end_time=yyy - 优点:可以为复杂数据集提供最佳性能和灵活性
- 缺点:实现更复杂,需要仔细设计
架构模式对比
这些架构模式是在应用开发中最常用的,无论是在 iOS 还是 Android 平台上。开发者引入它们是为了克服早期模式的限制。那么,它们如何不同?
- MVC:最古老的模式,可追溯到近 50 年前
- 每个模式都有一个”视图”(V)负责显示内容和接收用户输入
- 大多数模式包括一个”模型”(M)来管理业务数据
- “控制器”、“展示器”和”视图模型”是视图和模型之间的翻译器(VIPER 模式中的”实体”)
- 这些翻译器可能相当复杂,所以提出了各种模式使它们更易维护
当你在浏览器中输入 URL 时会发生什么?
下图说明了步骤。
Bob 在浏览器中输入 URL 并按 Enter:
- scheme -
http://:告诉浏览器使用 HTTP 发送连接到服务器 - domain -
example.com:这是网站的域名 - path -
product/electric:这是服务器上请求资源的路径:phone - resource -
phone:这是 Bob 想访问的资源名称
- scheme -
浏览器通过域名系统(DNS)查找查找域名的 IP 地址:
- 为使查找过程快速,数据在不同层缓存:浏览器缓存、OS 缓存、本地网络缓存和 ISP 缓存
- 如果在任何缓存中找不到 IP 地址,浏览器去 DNS 服务器进行递归 DNS 查找直到找到 IP 地址
现在我们有了服务器的 IP 地址,浏览器与服务器建立 TCP 连接
浏览器发送 HTTP 请求到服务器:
GET /phone HTTP/1.1Host: example.com服务器处理请求并发送回响应:
HTTP/1.1 200 OKDate: Sun, 30 Jan 2022 00:01:01 GMTServer: ApacheContent-Type: text/html; charset=utf-8Hello world浏览器渲染 HTML 内容
QR 码支付流程
要理解涉及的过程,我们需要将”扫描支付”过程分为两个子过程:
- 商家生成 QR 码并在屏幕上显示
- 消费者扫描 QR 码并支付
生成 QR 码的步骤
- 当你想为购物付款时,收银员计算所有商品并计算总金额,例如$123.45。结账有订单 ID 为 SN129803。收银员点击”结账”按钮。
- 收银员的计算机将订单 ID 和金额发送到 PSP。
- PSP 将此信息保存到数据库并生成 QR 码 URL。
- PSP 的支付网关服务读取 QR 码 URL。
- 支付网关返回 QR 码 URL 到商家的计算机。
- 商家的计算机发送 QR 码 URL(或图像)到结账柜台。
- 结账柜台显示 QR 码。
这 7 步在不到一秒内完成。现在是消费者从数字钱包扫描 QR 码支付的时候:
- 消费者打开他们的数字钱包应用扫描 QR 码。
- 确认金额正确后,客户端点击”支付”按钮。
- 数字钱包应用通知 PSP 消费者已支付给定的 QR 码。
- PSP 支付网关标记此 QR 码为已支付并返回成功消息给消费者的数字钱包应用。
- PSP 支付网关通知商家消费者已支付给定的 QR 码。
本文为学习目的的个人翻译,译文仅供参考。
原文链接:EP118: What are the differences among database locks?。
版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。