当前位置: 首页 > news >正文

秒杀系统三层架构设计:缓存、消息队列与数据库

秒杀是一种极端高并发场景,短时间内数百万用户涌入,抢购有限库存的商品。为了保证系统稳定性和数据一致性,同时提升用户体验,我们可以设计一个三层架构缓存层消息队列层数据库层。本文将详细设计这一架构并探讨其优点与实现方式。


1. 秒杀三层架构简介

秒杀架构的三层功能分工如下:

第一层:缓存层

  • 快速处理用户请求,减少访问数据库。
  • 提供库存的预检功能,快速反馈请求结果。

第二层:消息队列层

  • 削峰填谷,缓解高并发对后端服务的冲击。
  • 保证秒杀请求的顺序性,防止超卖。

第三层:数据库层

  • 最终扣减库存并记录订单信息,确保数据持久化和一致性。

2. 架构设计流程

2.1 秒杀流程概览

  1. 用户发起秒杀请求,首先进入缓存层。
  2. 缓存层快速检查库存是否可用,若库存不足,直接返回失败;若库存充足,进入下一层。
  3. 请求进入消息队列,按顺序处理,避免并发超卖。
  4. 消息队列中的请求由消费者逐条处理,最终访问数据库扣减库存并生成订单。
  5. 秒杀结果异步通知用户,或用户自行查询。

3. 各层设计详解

3.1 缓存层设计

功能
  • 快速判断商品库存是否足够。
  • 将热点商品的库存信息缓存在内存中,避免频繁访问数据库。
  • 限制超量请求,提高秒杀效率。
实现
  • 使用 RedisMemcached 缓存商品的库存信息:
  • 在用户请求时,通过 Lua 脚本实现原子操作,快速检查和扣减库存:
local stock = redis.call('GET', KEYS[1])
if tonumber(stock) > 0 thenredis.call('DECR', KEYS[1])return 1  -- 扣减成功
elsereturn 0  -- 库存不足
end
注意事项
  1. 缓存穿透:对非法请求(如商品ID不存在)进行拦截,可以使用布隆过滤器。
  2. 缓存雪崩:设置不同商品的缓存过期时间,避免大规模缓存同时失效。
  3. 并发一致性:为缓存操作增加分布式锁,防止库存扣减不一致。

3.2 消息队列层设计

功能
  • 削峰填谷,缓解高并发对后端系统的冲击。
  • 按请求的先后顺序处理,保证秒杀公平性和库存的一致性。
实现


3.3 数据库层设计

功能

实现
  • 使用 RabbitMQKafkaRocketMQ,构建秒杀请求队列。
  • 用户请求通过缓存层验证后,写入消息队列:
  • 消费者从队列中拉取请求,逐条处理,调用数据库扣减库存。
  • 注意事项
  • 队列长度限制:设置队列的最大长度(如10万条),超过长度直接拒绝请求,返回“秒杀结束”。
  • 消息重复消费:使用唯一请求ID去重,避免重复扣减库存。
  • 队列高可用:采用主从模式或分区机制,确保队列的高可靠性。
  • 最终扣减库存,记录订单信息,确保数据持久化。
  • 保证库存扣减和订单生成的原子性。
  • 数据库表设计:
    库存表

CREATE TABLE stock (product_id BIGINT PRIMARY KEY,total_stock INT NOT NULL,reserved_stock INT NOT NULL
);

使用 事务存储过程 保证库存扣减与订单生成的原子性:

BEGIN;
-- 检查库存
SELECT total_stock - reserved_stock INTO available_stock
FROM stock WHERE product_id = ? FOR UPDATE;
IF available_stock >= ? THEN-- 扣减库存UPDATE stock SET reserved_stock = reserved_stock + ?WHERE product_id = ?;-- 创建订单INSERT INTO orders (user_id, product_id, quantity) VALUES (?, ?, ?);
END IF;
COMMIT;
注意事项
  1. 分库分表:对于大规模秒杀场景,按商品ID或用户ID进行分库分表,减少单表压力。
  2. 读写分离:库存查询和订单记录可采用主从同步,提升查询性能。
  3. 高可用设计:采用主备切换和故障恢复机制,保障数据库服务持续可用。

4. 架构优势

高性能

  • 缓存层快速响应用户请求,降低数据库访问压力。
  • 消息队列平滑处理高并发请求,避免系统过载。

高稳定性

  • 各层解耦,缓存、消息队列和数据库可独立扩展,提升整体可靠性。
  • 即使部分服务宕机,秒杀请求可在消息队列中暂存,确保请求不丢失。

高一致性

  • 缓存层、消息队列层和数据库层逐步确认库存状态,避免超卖问题。
  • 数据库层事务保证最终一致性,确保库存扣减和订单生成的原子性。

5. 秒杀流程总结

  1. 用户请求:进入缓存层,快速预检库存并扣减,确保高性能。
  2. 消息队列处理:请求写入消息队列,按顺序处理,削峰填谷。
  3. 数据库持久化:最终扣减库存,生成订单,确保数据一致性和持久性。

6. 实现挑战与优化方向

挑战

  • 高并发时缓存层可能成为瓶颈,需对 Redis 集群进行优化。
  • 消息队列的消费速度需要与数据库处理能力匹配。
  • 数据库扩展需要分库分表等复杂设计。

优化方向

  • 缓存与消息队列的多层组合,提升系统吞吐能力。
  • 使用分布式数据库(如TiDB)或NoSQL数据库(如MongoDB)提升数据库性能。
  • 利用异步通知和多级缓存,提高用户体验和响应速度。

7. 结论

通过三层架构设计,缓存、消息队列和数据库各司其职,能够有效应对秒杀场景中的高并发、高性能需求。缓存层负责快速响应,消息队列层平滑处理请求,数据库层保证数据一致性,三者结合为秒杀系统提供了稳定、高效的解决方案。

相关文章:

秒杀系统三层架构设计:缓存、消息队列与数据库

秒杀是一种极端高并发场景,短时间内数百万用户涌入,抢购有限库存的商品。为了保证系统稳定性和数据一致性,同时提升用户体验,我们可以设计一个三层架构:缓存层、消息队列层、数据库层。本文将详细设计这一架构并探讨其…...

tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk

官网链接:What is Tauri? | Tauri 初始准备 rust版本一定要1.77.2以上的版本,查看版本和升级版本: 升级命名: rustup update 不然会报错: error: package tauri-plugin-shell v2.0.2 cannot be built because it r…...

SCI论文部分题目

SC20243213 通过氢和氨集成增强Power-to-X灵活性和可持续成本降低:绿色实验室Skive案例研究 SC20243211 分析同时发电的综合系统中的能量和能量效率、环境影响和经济可行性,淡水、热水和天然气凝液 SC20243208 双燃料生物质-天然气系统中的氢、…...

使用PyTorch在AMD GPU上进行INT8量化实现精简化的LLM推理

Leaner LLM Inference with INT8 Quantization on AMD GPUs using PyTorch — ROCm Blogs 随着大型语言模型(LLMs)规模达到数千亿参数,我们在这些庞大模型中表示数据的方式极大地影响了训练所需的资源(例如,用于推理的…...

Solon 拉取 maven 包很慢或拉不了,怎么办?

注意:如果在 IDEA 设置里指定了 settings.xml,下面两个方案可能会失效。(或者直接拿 "腾讯" 的镜像仓库地址,按自己的习惯配置) 1、可以在项目的 pom.xml 添加 "腾讯" 的镜像仓库 "阿里&qu…...

spring的事务隔离?

在Spring中,事务的隔离级别是指在多事务并发执行时,事务之间的隔离程度,隔离级别定义了一个事务可以看到另一个事务的哪些数据,Spring事务管理器允许通过Transactional注解或者xml配置来指定事务的隔离级别。 事务的隔离级别有以…...

13 —— 开发环境调错-source map

问题:代码被压缩后,无法正确定位源代码的位置(行数和列数) source map:准确追踪error和warning在原始代码的位置 —— webpack.config.js配置devtool选项 module.exports { devtool: inline-source-map }; inline-s…...

【大数据分析深度学习】在Hadoop上实现分布式深度学习

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘,以提取有价值的信息和洞察。它结合了大数据技术、人工智能(AI)、机器学习(ML&a…...

【Linux探索学习】第十六弹——进程地址空间:深入解析操作系统中的进程地址空间

Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 进程地址空间是操作系统进程管理的重要概念之一,它定义了进程在执行时所能访问的内存布局。理解进程地址空间不仅有助于掌握操…...

【数据结构与算法】相交链表、环形链表(判断是否有环)、环形链表(返回入环节点)

主页:HABUO🍁主页:HABUO 🍁如果再也不能见到你,祝你早安,午安,晚安🍁 1.相交链表 题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表…...

hubuctf-2024校赛-复现wp

web easyweb1 <?php error_reporting(0); highlight_file(__FILE__);$flag getenv("GZCTF_FLAG");if(isset($_GET[num])){$num $_GET[num];if(preg_match("/[0-9]/", $num)){die("You are failed.");}if(intval($num)){echo $flag;} } 利…...

.NET Core发布网站报错 HTTP Error 500.31

报错如图&#xff1a; 解决办法&#xff1a; 打开任务管理器》》服务》》找到这仨服务&#xff0c;右键启动即可&#xff0c;如果已经启动了就重启&#xff1a;...

RTSP摄像头、播放器为什么需要支持H.265?

H.264还是H.265&#xff1f; 好多开发者在做选RTSP播放器的时候&#xff0c;经常问我们的问题是&#xff0c;用H.264好还是H.265好&#xff1f;本文我们就H.264 和 H.265的主要区别和适用场景&#xff0c;做个大概的交流。 一、压缩效率 H.265 更高的压缩比 H.265 在相同视频…...

brynet源码阅读——解决文件描述符耗尽问题mIdle

1、背景 在高并发服务器程序中&#xff0c;文件描述符资源是有限的。当一个程序同时处理多个网络连接时&#xff0c;每个连接都会占用一个文件描述符。如果系统没有足够的文件描述符可用&#xff0c;调用 accept()&#xff08;用于接收新的连接&#xff09;或其他文件操作时可…...

学习Zookeeper

Zookeeper有手就行 1. 初识ZooKeeper1.1 安装ZooKeeper1.2 ZooKeeper命令操作1.2.1 Zookeeper数据模型1.2.2 Zookeeper 服务端常用命令1.2.3 Zookeeper客户端常用命令 2. ZooKeeperJavaAPl操作2.1 Curator介绍2.2 CuratorAPI常用操作2.2.0 引入Curator支持2.2.1 建立连接2.2.2 …...

css效果

css炫彩流光圆环效果 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><style>*{margin: 0;padding: 0;}body{width: 100%;height: 100vh;}.container{position: relative;width: 100%;height: 100vh…...

【Python爬虫五十个小案例】爬取豆瓣电影Top250

博客主页&#xff1a;小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介&#xff1a;分享五十个Python爬虫小案例 &#x1fab2;前言 在这篇博客中&#xff0c;我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests库来发送HTTP请求&#xff0c;…...

「Mac玩转仓颉内测版25」基础篇5 - 布尔类型详解

本篇将介绍 Cangjie 中的布尔类型&#xff0c;包括布尔值的定义、运算操作符、逻辑运算、布尔类型的常见应用场景及其在条件判断中的应用&#xff0c;帮助开发者理解和使用布尔类型。 关键词 布尔类型定义布尔运算逻辑运算符条件判断常见应用场景 一、布尔类型概述 布尔类型&…...

electron主进程和渲染进程之间的通信

主进程 (main.js) const { app, BrowserWindow, ipcMain } require("electron"); const path require("node:path"); // 导入fs模块 const fs require("fs");const createWindow () > {const win new BrowserWindow({width: 800,height…...

在 Spring Boot 中实现多种方式登录(用户名、手机号、邮箱等)的不正经指南

欢迎来到一场技术与幽默交织的冒险&#xff01;今天&#xff0c;我们将跳进 Spring Boot 的世界&#xff0c;探索如何通过 用户名、手机号、邮箱 等多种方式实现登录。想象一下&#xff0c;用户在登录时可以随心所欲地选择——就像你今天早上纠结到底是要喝美式咖啡还是拿铁&am…...

JVM标量替换

JVM标量替换 简单来说 JVM 中的标量替换是一种编译优化技术&#xff0c;将未逃逸对象拆解成不能再分&#xff0c;标量在栈帧或寄存器中分配使用。将对象拆解后直接使用标量&#xff0c;不但避免了完整对象的创建和后续回收流程&#xff0c;而且能更快地获取和操作相应的数据&…...

Python深度学习框架:PyTorch、Keras、Scikit-learn、TensorFlow如何使用?学会轻松玩转AI!

前言 我们先简单了解一下PyTorch、Keras、Scikit-learn和TensorFlow都是什么。 想象一下你要盖一座大房子。你需要砖头、水泥、工具等等&#xff0c;对吧&#xff1f;机器学习也是一样&#xff0c;需要一些工具来帮忙。PyTorch、Keras、Scikit-learn和TensorFlow就是四种不同的…...

C语言蓝桥杯组题目

系列文章目录 文章目录 系列文章目录前言题目第一题.1, 2, 3, 4 能组成多少个互不相同且无重复数字的三位数&#xff1f;都是多少&#xff1f;思路 第二题: 一个整数&#xff0c;它加上100后是一个完全平方数&#xff0c;再加上168又是一个完全平方数&#xff0c;请问该数是多少…...

用Matlab和SIMULINK实现DPCM仿真和双边带调幅系统仿真

1、使用SIMULINK或Matlab实现DPCM仿真 1.1 DPCM原理 差分脉冲编码调制&#xff0c;简称DPCM&#xff0c;主要用于将模拟信号转换为数字信号&#xff0c;同时减少数据的冗余度以实现数据压缩。在DPCM中&#xff0c;信号的每个抽样值不是独立编码的&#xff0c;而是通过预测前一…...

真实网络安全面试场景题

1.公司内部搭建了2台DNS服务器做主辅同步&#xff0c;公司的业务官网地址为 www.chinaddic.com。小明作为网络管理员把域名添加至DNS服务器进行测试。 问题1:使用自己电脑可以正常访问刚添加的域名&#xff0c;但处于同样网络环境同事电脑却访问不了。 出现此问题原因…...

速盾:ddos防御手段哪种比较好?高防cdn怎么样?

DDoS&#xff08;分布式拒绝服务&#xff09;攻击是一种威胁网络安全的常见攻击手段。为了保护网站和服务器免受DDoS攻击的影响&#xff0c;许多安全专家和公司开发了各种防御手段。在这篇文章中&#xff0c;我们将重点讨论一种常见的DDoS防御手段——高防CDN&#xff08;内容分…...

【ArcGISPro】Sentinel-2数据处理

错误 默认拉进去只组织了4个波段,但是实际有12个波段 解决方案 数据下载 Sentinel-2 数据下载-CSDN博客 数据处理 数据查看 创建镶嵌数据集 在数据管理工具箱中找到创建镶嵌数据集...

【适配】屏幕拖拽-滑动手感在不同分辨率下的机型适配

接到一个需求是类似下图的3D多房间视角&#xff0c;需要拖拽屏幕 问题 在做这种屏幕拖拽的时候发现&#xff0c;需要拖拽起来有跟手的感觉&#xff0c;会存在不同分辨率机型的适配问题。 即&#xff1a;美术调整好了机型1的手感&#xff0c;能做到手指按下顶层地板上下挪动&…...

谷粒商城-消息队列Rabbitmq

RabbitMq参考文档 在谷粒商城项目中使用消息队列主要有以下几个重要原因&#xff1a; 异步处理提高性能 场景示例&#xff1a;在订单系统中&#xff0c;当用户提交订单后&#xff0c;系统需要完成多个操作&#xff0c;如更新库存、生成订单记录、发送订单通知等。如果这些操作…...

python-爬虫入门指南

前言&#xff1a;由于个人负责的运维组&#xff0c;其中有个同事每回在某个项目发版更新后&#xff0c;需手动在k8s容器平台web界面上复制出几百个微服务的名称以及镜像版本等信息&#xff0c;用来更新微服务清单&#xff0c;个人决定抽时间写个爬虫脚本自动完成手动执行的任务…...

力扣—53. 最大子数组和

53. 最大子数组和 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4…...

STM32H7开发笔记(2)——H7外设之多路定时器中断

STM32H7开发笔记&#xff08;2&#xff09;——H7外设之多路定时器中断 文章目录 STM32H7开发笔记&#xff08;2&#xff09;——H7外设之多路定时器中断0.引言1.CubeMX配置2.软件编写 0.引言 本文PC端采用Win11STM32CubeMX4.1.0.0Keil5.24.2的配置&#xff0c;硬件使用STM32H…...

kafka如何知道哪个消费者消费哪个分区?

在Kafka中&#xff0c;消费者和分区之间的分配是通过一个称为“消费者组协调器”&#xff08;Consumer Group Coordinator&#xff09;的组件来管理的。 以下是Kafka如何确定哪个消费者消费哪个分区的步骤&#xff1a; 消费者加入消费者组&#xff1a; 当消费者启动时&#xf…...

Dockerfile构建报错【ERROR: failed to solve: process】的解决办法

报错信息如下 ERROR: failed to solve: process “/bin/sh -c yarn install” did not complete successfully: exit code: 1 解决 从阿里云等镜像站点下载CentOS-7.repo文件 ‌下载CentOS-7.repo文件‌&#xff1a;可以从阿里云等镜像站点下载CentOS-7.repo文件&#xff0c;…...

html渲染优先级

在前端开发中&#xff0c;优先布局是指在设计和构建页面时&#xff0c;将页面的各个部分按照其重要性和优先级进行排序&#xff0c;并依次进行布局和开发。这种方法可以帮助开发团队在项目初期就确定页面结构的核心部分&#xff0c;从而更好地掌控项目的整体进度和优先级。且确…...

AIX下crs-5005 ip address is aready in use in the network的解决办法

某业务生产系统中&#xff0c;三节点的rac数据库中3号节点因故障停机后&#xff0c;进行crs的重启。重启完成后&#xff0c;发现数据库的监听未起来&#xff0c;启动的过程中并提示crs-5005错误。 一、问题过程 查看监听&#xff0c;发现监听no service ywdb03/oracle/grid/c…...

Docker--通过Docker容器创建一个Web服务器

Web服务器 Web服务器&#xff0c;一般指网站服务器&#xff0c;是驻留于因特网上某种类型计算机的程序。 Web服务器可以向浏览器等Web客户端提供文档&#xff0c;也可以放置网站文件以供全世界浏览&#xff0c;或放置数据文件以供全世界下载。 Web服务器的主要功能是提供网上…...

C#里怎么样自己实现10进制转换为二进制?

C#里怎么样自己实现10进制转换为二进制&#xff1f; 很多情况下&#xff0c;我们都是采用C#里类库来格式化输出二进制数。 如果有人要你自己手写一个10进制数转换为二进制数&#xff0c;并格式化输出&#xff0c; 就可以采用本文里的方法。 这里采用求模和除法来实现的。 下…...

sql 查询语句:将终端数据形式转换成insert语句

文本转换&#xff1a;sql 查询语句&#xff1a;将终端数据形式转换成insert语句 如上&#xff0c;写过后端的都知道&#xff0c;从生产或其他地方拿到的数据&#xff0c;有可能会是图一&#xff1b;但实际上&#xff0c;我们需要图二的数据&#xff1b; 不废话&#xff0c;直接…...

Spring Boot 应用开发:构建高效、可扩展的 Java 微服务

以下是一个简单的 Spring Boot 小项目示例&#xff0c;该项目是一个基于 Spring Boot 的博客系统后端部分。这个项目将展示如何使用 Spring Boot 框架来创建一个基本的 RESTful API 服务&#xff0c;以管理博客文章。 项目结构 spring-boot-blog ├── src │ ├── main…...

【Linux】安装 openssh-server 并打开 ssh 服务(Ubuntu 22.04)

引言 openssh-server是OpenSSH套件的一部分&#xff0c;它是SSH协议的开源实现。SSH&#xff0c;全称为Secure Shell&#xff0c;是一种网络协议&#xff0c;用于安全地在不安全的网络环境中执行远程命令和传输数据。 配置步骤 在Ubuntu系统中安装openssh-server。 sudo apt…...

开源IM,为你的项目增加聊天功能

现在大多数APP&#xff0c;或多或少都会涉及到聊天功能&#xff0c;而大部分APP的选择则是接入TIM等三方IM服务&#xff0c;但是&#xff0c;这种方式对于大多数刚刚起步的APP来说&#xff0c;费用是非常昂贵的&#xff0c;基本上每月都有好几百的支出&#xff0c;并且&#xf…...

跨平台应用开发框架(1)----Qt(组件篇)

目录 1.Qt 1.Qt 的主要特点 2.Qt的使用场景 3.Qt的版本 2.QtSDK 1.Qt SDK 的组成部分 2.安装 Qt SDK 3.Qt SDK 的优势 3.Qt初识 1.快速上手 widget.cpp mian.cpp widget.h Helloworld.pro 2.对象树 3.坐标系 4.信号和槽 1. 信号和槽的基本概念 2. 信号和槽的…...

Java基础 设计模式——针对实习面试

目录 Java基础 设计模式单例模式工厂模式观察者模式策略模式装饰器模式其他设计模式 Java基础 设计模式 单例模式 单例模式&#xff08;Singleton Pattern&#xff09; 定义&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。适用场景&…...

C++ —— 以真我之名 如飞花般绚丽 - 智能指针

目录 1. RAII和智能指针的设计思路 2. C标准库智能指针的使用 2.1 auto_ptr 2.2 unique_ptr 2.3 简单模拟实现auto_ptr和unique_ptr的核心功能 2.4 shared_ptr 2.4.1 make_shared 2.5 weak_ptr 2.6 shared_ptr的缺陷&#xff1a;循环引用问题 3. shared_ptr 和 unique_…...

k8s中部署filebeat进行日志监听并发送到es中

注意事项 1. 需要将namespace修改为自己项目中的命名空间 2. es换成对应的地址 3. filebeat-inputs中的两个配置&#xff08;根据需要用任意一个就可以&#xff09; 3.1 第一个配置是监听docker日志&#xff0c;由于系统日志太多所以这里只监听项目部署命名空间下的内容 -…...

HTTP Accept用法介绍

一、HTTP Accept是什么 HTTP协议是一个客户端和服务器之间进行通信的标准协议&#xff0c;它定义了发送请求和响应的格式。而HTTP Accept是HTTP协议中的一个HTTP头部&#xff0c;用于告诉服务器请求方所期望的响应格式。这些格式可以是媒体类型、字符集、语言等信息。 HTTP A…...

软件工程设计模式--结构型设计模式

设计模式的核心思想 &#xff1a;  广义——软件设计模式是可解决一类软件问题并能重 复使用的软件设计方案  狭义——设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述&#xff0c;是在类和对象的层次描述的可重复使用的软件设计问题的解决方…...

HTML5好看的音乐播放器多种风格(附源码)

文章目录 1.设计来源1.1 音乐播放器风格1效果1.2 音乐播放器风格2效果1.3 音乐播放器风格3效果1.4 音乐播放器风格4效果1.5 音乐播放器风格5效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&…...

【FPGA】Verilog:利用 4 个串行输入- 串行输出的 D 触发器实现 Shift_register

0x00 什么是寄存器 寄存器(Register)是顺序逻辑电路中使用的基本组成部分之一。寄存器用于在数字系统中存储和处理数据。寄存器通常由位(bit)构成,每个位可以存储一个0或1的值。通过寄存器,可以设计出计数器、加法器等各种数据处理电路。 0x01 寄存器的种类 基于 D 触发…...