本周系统设计复习:

  • 数据库锁有什么区别?
  • 我们如何在 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 时会发生什么?

下图说明了步骤。

  1. Bob 在浏览器中输入 URL 并按 Enter

    • scheme - http://:告诉浏览器使用 HTTP 发送连接到服务器
    • domain - example.com:这是网站的域名
    • path - product/electric:这是服务器上请求资源的路径:phone
    • resource - phone:这是 Bob 想访问的资源名称
  2. 浏览器通过域名系统(DNS)查找查找域名的 IP 地址

    • 为使查找过程快速,数据在不同层缓存:浏览器缓存、OS 缓存、本地网络缓存和 ISP 缓存
    • 如果在任何缓存中找不到 IP 地址,浏览器去 DNS 服务器进行递归 DNS 查找直到找到 IP 地址
  3. 现在我们有了服务器的 IP 地址,浏览器与服务器建立 TCP 连接

  4. 浏览器发送 HTTP 请求到服务器

    GET /phone HTTP/1.1
    Host: example.com
  5. 服务器处理请求并发送回响应

    HTTP/1.1 200 OK
    Date: Sun, 30 Jan 2022 00:01:01 GMT
    Server: Apache
    Content-Type: text/html; charset=utf-8
    Hello world
  6. 浏览器渲染 HTML 内容

QR 码支付流程

要理解涉及的过程,我们需要将”扫描支付”过程分为两个子过程:

  • 商家生成 QR 码并在屏幕上显示
  • 消费者扫描 QR 码并支付

生成 QR 码的步骤

  1. 当你想为购物付款时,收银员计算所有商品并计算总金额,例如$123.45。结账有订单 ID 为 SN129803。收银员点击”结账”按钮。
  2. 收银员的计算机将订单 ID 和金额发送到 PSP。
  3. PSP 将此信息保存到数据库并生成 QR 码 URL。
  4. PSP 的支付网关服务读取 QR 码 URL。
  5. 支付网关返回 QR 码 URL 到商家的计算机。
  6. 商家的计算机发送 QR 码 URL(或图像)到结账柜台。
  7. 结账柜台显示 QR 码。

这 7 步在不到一秒内完成。现在是消费者从数字钱包扫描 QR 码支付的时候:

  1. 消费者打开他们的数字钱包应用扫描 QR 码。
  2. 确认金额正确后,客户端点击”支付”按钮。
  3. 数字钱包应用通知 PSP 消费者已支付给定的 QR 码。
  4. PSP 支付网关标记此 QR 码为已支付并返回成功消息给消费者的数字钱包应用。
  5. PSP 支付网关通知商家消费者已支付给定的 QR 码。

本文为学习目的的个人翻译,译文仅供参考。

原文链接:EP118: What are the differences among database locks?

版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。