深入HBase——引入
引入
前面我们通过深入HDFS到深入MapReduce ,从设计和落地,去深入了解了大数据最底层的基石——存储与计算是如何实现的。
这个专栏则开始来看大数据的三驾马车中最后一个。
通过前面我们对于GFS和MapReduce论文实现的了解,我们知道GFS在数据写入时,只对顺序写入有比较弱的一致性保障,而对于数据读取,虽然GFS支持随机读取,但在当时的硬件条件下,实际上也是支撑不了真正的高并发读取的;此外,MapReduce虽然是一个批量处理数据的框架,吞吐量很大,但其延时和额外开销也不小。
在计算机数据存储领域,一直是关系数据库(RDBMS)的天下,以至于在传统企业的应用领域,许多应用系统设计都是面向数据库设计,也就是先设计数据库然后设计程序,从而导致关系模型绑架对象模型,并由此引申出旷日持久的业务对象贫血模型(业务逻辑由服务层处理,领域对象只包含数据。服务层通过调用领域对象的属性和方法来完成业务逻辑。)与充血模型(业务逻辑在领域对象中实现。领域对象不仅包含数据,还包含与数据相关的业务逻辑。服务层只负责接收用户的请求,并调用领域对象的方法来完成业务逻辑。)之争。
业界为了解决关系数据库的不足,提出了诸多方案,比较有名的是对象数据库,但是这些数据库的出现似乎只是进一步证明关系数据库的优越而已。直到人们遇到了关系数据库难以克服的缺陷——糟糕的海量数据处理能力及僵硬的设计约束,局面才有所改善。从Google的BigTable开始,一系列的可以进行海量数据存储与访问的数据库被设计出来,更进一步说,NoSQL这一概念被提了出来。
NoSQL主要指非关系的、分布式的、支持海量数据存储的数据库设计模式。不过随着技术的演进,NoSQL的解释也从最初的“No SQL”到现在的“Not Only SQL”,表示NoSQL只是关系数据库的补充,而不是替代方案。其中,HBase是这一类NoSQL系统的杰出代表。
HBase之所以能够具有海量数据处理能力,其根本在于和传统关系型数据库设计的不同思路。传统关系型数据库对存储在其上的数据有很多约束,学习关系数据库都要学习数据库设计范式,事实上,是在数据存储中包含了一部分业务逻辑。而NoSQL数据库则简单暴力地认为,数据库就是存储数据的,业务逻辑应该由应用程序去处理。
我们可以梳理出来,Bigtable要解决核心问题就是:如何支撑业务海量数据的随机读写(例如百万级别的随机读写IOPS)。
我们自然而然能想到的就是借鉴GFS的设计思路,除此之外还需要考虑到实时处理场景下如何提高容错。
Bigtable的答案,其实总结起来就三点:
-
将整个系统的存储层,搭建在GFS上。然后通过单Master调度多Tablets的方式,使得整个集群非常容易伸缩和维护。
-
通过MemTable+SSTable这样一个底层文件格式,解决高速随机读写数据的问题。
-
通过Chubby这个高可用的分布式锁服务解决一致性的挑战。
而本专栏的主角HBase,就是源自于Google的Bigtable论文。
HBase 同样利用 HDFS 作为底层存储,但是并不是简单地使用原本的数据,只是使用 HDFS 作为它的存储系统。也就是说,HBase 只是利用 Hadoop 的 HDFS 帮助其管理数据的持久化文件。HBase 提供超大规模数据集的实时随机读写,弥补了早期 Hadoop只能离线处理数据的不足。
一句话概括的话,HBase就是基于Hadoop构建的一个高可用、高性能、多版本的分布式NoSQL数据库,是Google BigTable的开源实现,通过在廉价服务器上搭建大规模结构化存储集群,提供海量数据高性能的随机读写能力。
下面我们先通过HBase的一些核心概念去初步了解一下它。
基本概念
-
表(Table):HBase中的表由行和列组成,一个表包含多行数据。表中的数据按照RowKey进行排序存储,支持范围查询。
-
行(row):,一行数据包含一个唯一标识rowkey、多个column以及对应的值。在HBase中,一张表中所有row都按照rowkey的字典序由小到大排序。
-
行键(Row Key):行是表中数据的基本单位,由RowKey标识。RowKey是字节序列,可以是任意长度,通常设计为能够反映数据的逻辑顺序。这是我们一行数据的唯一标识,比如说我们平时的数据都会有一个唯一 ID,就可以用来作为 Row Key。但是需要注意的是,HBase 在存储 Row Key 的时候是按照字典顺序存放的,所以如果你的 Row Key 不是以分布均匀的数字或字母开头的,很可能造成存储集中在某一台机器上,这会大大降低查询效率,所以这种时候需要设计存储的 Row Key,比如在每个 ID 的前面都加一个 HASH 值来提升查询性能。
-
列(column):,与关系型数据库中的列不同,HBase中的column由column family(列簇)以及qualifier(列名)两部分组成,两者中间使用":"相连。column family在表创建的时候需要指定,用户不能随意增减。一个column family下可以设置任意多个qualifier,因此可以理解为HBase中的列可以动态增加,理论上甚至可以扩展到上百万列。
-
列簇(Column Family):列簇是表中数据的物理存储单位,用于组织数据。列簇内的数据具有相同的列前缀,并且通常一起存储在同一个磁盘文件中。可以看作是一组列,实际上一个列簇的作用也是用来管理若干个列,优化查询速度。所以列簇的名字要尽量短,同时对于经常需要一起查询的列放在一个列簇下面。比如说对于用户信息,一个用户的静态属性(姓名、年龄、电话、地址等)可以放在一个列簇下面,动态属性(点赞、收藏、评论等)可以放在一个列簇下面。HBase表中的列簇需要预先定义,如果要新增列簇就要先停用这个表。
-
列名(Column Qualifier):是用于唯一标识列簇中具体列的标签。它与列簇一起组成列的完整标识。Qualifier可以动态地添加到列簇中,而无需预先定义,这使得HBase能够适应不同数据模式和需求的变化,而无需对表格的架构进行修改。
-
单元(Cell):指的是一个确定的存储单元。由五元组(row, column, timestamp, type, value)组成的结构,其中type表示 Put/Delete 这样的操作类型,timestamp代表这个cell的版本。这个结构在数据库中实际是以KV结构存储的,其中(row, column, timestamp,type)是K,value字段对应KV结构的V。单元格中的数据没有类型的概念,而是以字节序列的形式存储( 字符串正常存储,非字符串类型数据底层字节序列会转换成十六进制显示)。每个列簇中的列可以存储多个版本的数据,每个版本由其对应的时间戳标识,并且每个版本的值都构成一 个单元格。
-
时间戳(Timestamp):时间戳用于记录数据的创建或修改时间,并支持多版本数据。每个单元格(Cell)都可以存储多个版本的数据,版本通过时间戳来索引。
-
区域(Region):一个 Region 可以看作是多行数据的集合。当一个表的数据逐渐增多,需要进行分布式存储,那么这个表就会自动分裂成多个 Region,然后分配到不同的 RegionServer 上面去。
数据模型
既然HBase是一个数据库,那最核心的自然是怎么组织存储数据了,HBase的数据模型设计主要包括以下几个方面:
-
面向列的存储模型:HBase采用面向列的存储模型,表的基本单元是“列簇(Column Family)”。
-
数据多版本支持:HBase支持数据的多版本,每个单元格的数据可以有多个版本,版本通过时间戳来索引。
-
稀疏数据支持:HBase支持稀疏数据,即某些列可以为空,不会占用存储空间。
数据目录
HBase的数据目录主要包括以下几个方面:
-
根目录:HBase的根目录在HDFS中是
/hbase
,这是所有HBase数据的顶级目录。 -
数据目录:在根目录下,有一个名为
/data
的目录,它是HBase数据的核心存储区域,包含了所有的表数据、日志数据等。 -
Namespace目录:HBase中的Namespace是用来组织和管理表的命名空间。在
/data
目录下,根据Namespace的不同,会有相应的子目录,例如/data/default
。 -
表目录:每个表在Namespace目录下都有一个对应的子目录,例如
/data/default/mytable
。这个目录下包含了该表的所有数据。 -
Region目录:HBase中的表会被切分为多个Region,每个Region由一个或多个Store组成。每个Region在表目录下都有一个对应的子目录,例如
/data/default/mytable/a3d605ed-33fe-4458-90ad-57c79989c730
。 -
ColumnFamily目录:每个ColumnFamily在Region目录下都有一个对应的子目录,例如
/data/default/mytable/a3d605ed-33fe-4458-90ad-57c79989c730/cf1
。这个目录下包含了该ColumnFamily的所有数据。
为了更好理解HBase表存储结构,这里将HBase表存储结构分为表逻辑结构和表物理结构两个部 分介绍。
表逻辑结构
RowKey | Column Family | Column Family | ||
Column Qualifier | Column Qualifier | Column Qualifier | Column Qualifier | |
rowkey | cell | cell | cell | cell |
rowkey | cell | cell | cell | cell |
... | ... | ... | ... | ... |
为了更清晰理解HBase表逻辑结构,填充样例数据如下(其中89c730对应的age为空):
RowKey | staticattribute | dynamicattribute | ||
name | age | like | favorites | |
57c799 | chaos | 18 | hadoop | hadoop |
89c730 | hbase | zookeeper | hdfs | |
... | ... | ... | ... | ... |
表物理结构
在HBase中表数据存储并不是按照表逻辑结构进行存储,而是按照如下方式进行存储(以先前样例数据为例):
RowKey | Column Family | Column Qualifier | Timestamp | Value | |
57c799 | staticattribute | name | 1000 | chaos | Region |
57c799 | staticattribute | age | 1000 | 18 | |
57c799 | dynamicattribute | like | 1000 | hadoop | |
57c799 | dynamicattribute | favorites | 1000 | hadoop | |
89c730 | staticattribute | name | 2000 | hbase | Region |
89c730 | dynamicattribute | like | 2000 | zookeeper | |
89c730 | dynamicattribute | favorites | 2000 | hdfs |
注意:在表逻辑结构中的空值在HBase底层不会进行存储。
HBase的物理存储结构设计主要包括以下几个方面:
-
HDFS存储:HBase的数据最终存储在HDFS上,以HFile的形式存在。HFile是HBase的物理存储文件,以列簇为单位进行存储。
-
Region:HBase通过Region来对表进行分片,每个Region负责存储某个RowKey范围内的行。当表中的数据增长到一定程度时,Region会被拆分为两个新的Region。
-
Store:每个列簇对应一个Store,用于管理该列簇的数据。Store由内存中的MemStore和磁盘上的HFile组成。数据先写入MemStore,然后定期将MemStore中的数据刷到磁盘形成HFile。
-
MemStore和HFile:MemStore是内存中的数据结构,用于缓存写入操作。当MemStore达到一定大小后,数据将被刷写到HFile中。HFile是磁盘上的物理存储文件,存储了列簇的数据。
架构设计
HBase建立在Hadoop HDFS之上,底层使用HDFS进行数据存储,HBase集群中主要由以下几个部分组成:
-
Client:Client为访问HBase的客户端,包含访问HBase的接口并维护cache来加快对HBase的访问。Client通过zookeeper获取hbase:meta表位置信息,然后获取要操作的Region信息并与该 region的RegionServer通信,发出读取或写入请求。获取的Region信息会缓存在客户端中,以便后续请求无需经过查找过程。如果Master的负载均衡器重新平衡或者由于HRegionserver宕机,都会重新指定该region的 regionserver,客户端将重新查询hbase:meta表以确定用户region的新位置。
-
HMaster:HMaster是HBase集群的主节点,负责管理RegionServer和Region的元数据、表的创建、分区的拆分和合并、Region的分配和迁移等任务。一个HBase集群中可以有多个 HMaster节点,由zk进行协调,保证只有一个HMaster运行,其余HMaster为Backup Master。
-
管理库表的元数据,如表对应Region信息,负责将Region分配给HRegionServer。
-
负责HRegionServer的负载均衡。当写入数据时负责将数据均衡的分布到各个Region上,避免HRegionServer数据存储倾斜;当读取数据时,将请求均衡的发送到各个RegionServer上,避免HRegionSever负载过大。
-
通过zk发现失效的HRegionServer并重新分配该HRegionServer上的Region。
-
-
HRegionServer:HRegionServer可以看成HBase架构中的从节点,习惯上也可称为RegionServer,HBase集群中一般有多台HRegionServer,主要负责数据读写请求。
一个HRegionServer包含一个HLog和多个HRegion,每个HRegion中有包含多个Store,每个 Store中又包含MemStore和StoreFile。-
管理HMaster分配的Region,处理来自客户端的读写请求(如:put、get请求),定期向 HMaster汇报Region状态。
-
负责Region变大拆分。当一个Region的数据量增大到一定程度,HRegionServer负责将 Region拆分为两个新的Region,实现数据均衡分布。
-
负责StoreFile合并。
-
负责与HDFS交互,将数据存储到HDFS中。
-
-
Zookeeper:HBase用Zookeeper进行分布式协调,帮助管理元数据、故障恢复和分布式锁。
-
存储HBase元数据,如:HMaster信息、HRegionServer信息、表对应HMaster信息、hbase: meta表位置信息。
-
协调HMaster的HA。通过zk保证HBase集群中只有一个HMaster运行,如果HMaster发生异常则通过zk选举新的HMaster提供服务。
-
监控RegionServer。zk监控RegionServer状态,当RegionServer异常时,会通知给HMaster 对应RegionServer上下线信息。
-
-
HDFS:HBase底层使用HFile格式将数据存储在HDFS中,HDFS中数据多副本可以为HBase提供高可靠、高可用性。
优缺点
优点
-
高扩展性:HBase采用分布式架构,能够轻松扩展到数千个节点,处理PB级别的数据。
-
高性能:HBase在处理大规模数据时表现出色,特别是在随机读写操作方面。
-
高可靠性:HBase通过数据冗余和自动故障恢复机制,确保数据的高可用性和系统的稳定性。
-
灵活的数据模型:HBase支持动态列,可以根据需要随时增加新的列,而无需预先定义表结构。
-
面向列的存储:HBase采用面向列的存储模型,使得数据的读写操作更加高效,特别适合处理稀疏数据。
-
适用于实时数据处理:HBase特别适合于实时数据处理、海量数据存储和高速随机读写等应用场景。
缺点
-
数据模型的限制:
-
强烈的Schema依赖:HBase的数据模型是基于列簇和列的,这要求在设计表结构时就必须明确定义列簇和列。Schema的修改成本较高,需要进行表结构的重建或者复杂的在线调整,这会影响系统可用性和性能。
-
缺乏丰富的查询功能:与关系型数据库相比,HBase的查询功能相对简陋。它主要支持基于行键的精确查找以及范围扫描,缺乏复杂的JOIN操作、聚合函数等功能。
-
数据原子性:HBase的行是原子性的,但列不是。这意味着在一个事务中,你只能更新整行数据,而不能单独更新某一列。
-
-
性能方面的问题:
-
写性能瓶颈:虽然HBase的读写性能都相对较高,但在高并发写操作下,HBase的写性能可能会成为瓶颈。
-
读性能瓶颈:当数据量非常大时,扫描大量数据可能会导致读性能下降。
-
热点区域:不均匀的数据分布会导致某些Region Server负载过重,形成热点区域,从而影响整体性能。
-
-
可用性和维护性:
-
数据一致性:HBase采用最终一致性模型,这意味数据在不同节点之间的同步存在延迟。
-
缺乏成熟的GUI工具:与一些关系型数据库相比,HBase缺乏成熟易用的GUI工具,这给数据的管理和监控带来不便。
-
数据备份和恢复:HBase的数据备份和恢复也相对复杂,需要额外的工具和策略来保障数据的安全性和可靠性。
-
相关文章:
深入HBase——引入
引入 前面我们通过深入HDFS到深入MapReduce ,从设计和落地,去深入了解了大数据最底层的基石——存储与计算是如何实现的。 这个专栏则开始来看大数据的三驾马车中最后一个。 通过前面我们对于GFS和MapReduce论文实现的了解,我们知道GFS在数…...
【前端】【vue】vue2/3,nuxt的插槽使用详解
插槽在Vue2、Vue3和不同版本Nuxt中的使用 Vue2中的插槽 基础插槽 在Vue2中,基础插槽允许在组件的模板中定义一个占位符,然后在使用组件时插入自定义内容。例如,创建一个简单的MyBox组件: <template><div class"…...
逆境、情绪低落时可用的锦囊、咒语
《浮生一梦》(一) 大多数人都经历过逆境低谷、失败、挫折、看似无端情绪低落、抑郁… 人逢情绪低落时,几乎任何话都听不进去,再正的能量也塞不进脑子,笑话笑不出来,食不知味… 复原力不强者很难走出来&am…...
【目标检测json2txt】label从COCO格式json文件转YOLO格式txt文件
目录 🍀🍀1.COCO格式json文件 🌷🌷2.YOLO格式txt文件 💖💖3.xml2json代码(python) 🐸🐸4.输入输出展示 🙋🙋4.1输入json 🍂🍂4.2输出txt 整理不易,欢迎一键三连!!! 送你们一条美丽的--分割线-- 🍀🍀1.COCO格式json文件 COCO数…...
ASP.NET Core SixLabors.ImageSharp 位图图像创建和下载
从 MVC 控制器内部创建位图图像并将其发送到浏览器;用 C# 编写并与 Linux 和 Windows 服务器兼容。 使用从 ASP.NET MVC 中的控制器下载任何文件类型File。 此示例创建一个位图 (jpeg) 并将其发送到浏览器。它需要 NuGet 包SixLabors.ImageSharp v1.0.4。 另请参…...
Java开发实战:使用IntelliJ IDEA 开发Spring Boot + MyBatis + MySQL的详细实现步骤
使用IntelliJ IDEA 开发Spring Boot MyBatis MySQL的详细实现步骤 在本文中,我们将一步步讲解如何在IntelliJ IDEA 2024.2.3中使用Spring Boot、MyBatis和MySQL来开发一个简单的Web应用。通过本文,你将学会如何设置项目、配置数据库、创建实体类、编写…...
python-leetcode-在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:def find_first(nums, target):left, right 0, len(nums) - 1result -1while left < rig…...
Oracle RHEL 7.8 安装
前言 Red Hat Enterprise Linux Server release 7.8 为企业级 SO 镜像。绝大部分企业如果使用Oracle数据库均会使用其企业版 OS ,能够很好的支持数据库的运行 文档目的 当前文档仅针对 VMware Workstation Pro 进行 OS 介质安装。 镜像下载地址 注意࿱…...
Java多线程交替打印
1. 双线程交替打印奇偶数 class Printer{private int num1; //要打印的数字private Object myLock new Object();public static void main(String[] args){Printer pnew Printer();Thread t1new Thread( ()->p.printNum(true), "threadA");t1.start();Thread t…...
华为2288H V5服务器无法启动问题处理
问题:通电后服务器前面显示888,点击电源键没有反应 一.通过管理口管理服务器硬件设备 华为2288H V5它默认的IP是192.168.2.100 网关是255.255.255.0 2.将网线一头连接服务器的Mgmt口,另一头来连接笔记本的网口,将笔记本的的本地…...
阿里巴巴对deepseek回应
行业背景与发布契机 当杭州的DeepSeek在相关领域展现实力时,阿里巴巴为了在技术竞争中占据一席之地,推出新的视觉 - 语言模型,试图吸引行业关注。 Qwen2.5 - VL系列模型发布详情 模型介绍:阿里巴巴发布Qwen2.5 - VL系列视觉 - 语…...
如何使用UniApp实现页面跳转和数据传递?
在 UniApp 中,页面跳转和数据传递是基本的功能,允许用户在应用中浏览不同的页面并传递必要的信息。以下是如何实现页面跳转和数据传递的详细步骤和示例。 一、页面跳转 UniApp 提供了几种方式来进行页面跳转,主要包括: uni.nav…...
STM32:迎接汽车与AI时代MCU新挑战
作为通用32位MCU市场最受关注的产品系列,意法半导体(ST)的STM32 MCU从2007年问世之后就迎来爆发式增长,成功占据通用32位MCU市占率领头羊的位置,并且不断引领着通用MCU技术与应用的新思维开拓。 本文引用地址…...
【操作系统】深入理解Linux物理内存
物理内存的组织结构 我们平时所称的内存也叫随机访问存储器也叫 RAM 。RAM 分为两类: 一类是静态 RAM( SRAM ),这类 SRAM 用于 CPU 高速缓存 L1Cache,L2Cache,L3Cache。其特点是访问速度快,访…...
K8s组件
一、Kubernetes 集群架构组件 K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责集群的调度、管理和运维,Slave 节点是集群中的运算工作负载节点。 主节点一般被称为 Master 节点,master节点上有 apis…...
【ESP32接入国产大模型之Deepseek】
【ESP32接入国产大模型之Deepseek】 1. Deepseek大模型1.1 了解Deepseek api1.2 Http接口鉴权1.3. 接口参数说明1.3.1 请求体(request)参数1.3.2 模型推理 2. 先决条件2.1 环境配置2.2 所需零件 3. 核心代码3.1 源码分享3.2 源码解析3.3 连续对话修改后的代码代码说明示例输出注…...
Vue 2 路由指南:从基础到高级
注意:对于代码看不清的部分,用鼠标选中就能看到了,背景颜色和字体颜色过于接近,我也不知道怎么调,只能这样子先看着了 一、Vue Router 是什么? Vue Router 是 Vue.js 官方的路由管理器,它允许…...
2025最新深度学习pytorch完整配置:conda/jupyter/vscode
从今天开始,开始一个新的专栏,更新深度学习相关的内容,从入门到精通,首先的首先是关于环境的配置指南:工欲善其事必先利其器! PyTorch 是由 Facebook(现 Meta)开发的 开源深度学习框…...
Python教学-最常用的标准库之一——OS库
os 库是 Python 标准库中的一个模块,它提供了一种方便的方式来使用操作系统相关的功能。os 模块提供了很多函数,可以用来处理文件和目录、访问环境变量、执行系统命令等。以下是一些常用的 os 模块的功能和示例: 1. 文件和目录操作 1.1 当前…...
尚硅谷爬虫note006
一、ajax的get请求 1. ajax的get请求—豆瓣电影第一页 # _*_ coding : utf-8 _*_ # Time : 2025/2/13 15:14 # Author : 20250206-里奥 # File : demo23_ajax的get请求 # Project : PythonProject10-14import urllib.requestfrom demo17_qingqiuduixaingdedingzhi import hea…...
LeetCode刷题---字符串---859
亲密字符串 859. 亲密字符串 - 力扣(LeetCode) 题目: 给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。 交换字母的定义是&…...
探索大数据处理:利用 Apache Spark 解锁数据价值
探索大数据处理:利用 Apache Spark 解锁数据价值 大家好,我是你们熟悉的大数据领域自媒体创作者Echo_Wish。今天,我们来聊聊如何利用Apache Spark进行大规模数据处理。Apache Spark作为一个快速、通用的集群计算框架,以其出色的性…...
伯克利 CS61A 课堂笔记 08 —— Strings and Dictionaries
本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理,全英文内容,文末附词汇解释。 目录 01 Strings 字符串 Ⅰ Strings are An Abstraction. Ⅱ Strings Literals have Three Forms Ⅲ String are Sequences 02 Dictionaries 字典 …...
V93K测试机
爱德万V9300(又称V93K)是Advantest公司推出的高端可扩展SoC测试平台,在半导体测试领域具有标杆地位。以下为该设备的详细介绍: ### 一、核心性能与技术优势 1. **高速高精度测试能力** V9300支持高达112 Gbps PAM4信号&…...
在 CentOS 上更改 SSH 默认端口以提升服务器安全性
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …...
基于逻辑概率的语义信道容量(Semantic Channel Capacity)和语义压缩理论(Semantic Compression Theory)
基于逻辑概率的语义信道容量(Semantic Channel Capacity)和语义压缩理论(Semantic Compression Theory)是语义通信(Semantic Communication, SemCom)的核心研究方向,它们旨在优化通信效率&#…...
Golang GORM系列:GORM事务及错误处理
在数据库管理领域,确保数据完整性至关重要。GORM是健壮的Go对象关系映射库,它为开发人员提供了维护数据一致性和优雅地处理错误的基本工具。本文是掌握GORM事务和错误处理的全面指南。我们将深入研究如何使用事务来保证原子性,并探索有效处理…...
51单片机-C语言扩展及最小系统
1、C-51的数据类型扩充定义 sfr:特殊功能寄存器声明 sfr:变量名地址值; 特殊功能寄存器在reg51.H这个头文件里面都帮我们定义好了,所以平时我们就不要自己去定义寄存器的名字。 sbit:特殊功能位声明sbit 变量名地址…...
日常问题-pnpm install执行没有node_modules生成
日常问题-pnpm install执行没有node_modules生成 1.问题2.解决方法 1.问题 执行pnpm i后,提示Scope: all 3 workspace projects Done in 503ms,而且没有node_modules生成。很奇怪 2.解决方法 确保根目录有 pnpm-workspace.yaml 文件: 把这…...
FreeRTOS低功耗总结
前言 Cortex-M核的MCU一般支持以下三种低功耗方式: ● 睡眠(Sleep)模式 ● 停止(Stop)模式 ● 待机(Standby)模式 睡眠模式 进入睡眠模式有两种指令:WFI(等待中断)和WFE(等待事件), WFI进入睡眠模式后,任意中断都可唤醒。 WFE进…...
UniApp 实现炫酷导航栏:选中图标上移并隐藏文字
在移动应用开发中,导航栏是用户与应用交互的重要组成部分,一个美观且交互性强的导航栏能大大提升用户体验。本文将详细介绍如何使用 UniApp 实现一个独特的导航栏,当用户选中某个导航项时,对应的图标会上移并隐藏文字,…...
Django 操作表中的数据(增删改查)
1.新建数据 我之前已经在数据库中创建了两张表,如下 在urls.py文件中添加一行代码,然后再在views.py文件中编写函数 (将 URL 路径 orm/ 映射到 Django 视图函数 views.orm,当用户访问 orm/ 时,Django 会调用 orm 视图…...
优选驾考小程序
第2章 系统分析 2.1系统使用相关技术分析 2.1.1Java语言介绍 Java语言是一种分布式的简单的 开发语言,有很好的特征,在安全方面、性能方面等。非常适合在Internet环境中使用,也是目前企业级运用中最常用的一个编程语言,具有很大…...
vue开发06:前端通过webpack配置代理处理跨域问题
1.定义 在浏览器尝试请求不同源(域名、协议、端口号不同)的资源时,浏览器的同源策略会阻止这种跨域请求。(比如前端端口15500,后端端口5050,前端界面不可以直接调用5050端口) 2.解决方案 使用前…...
C++基础 | 线程`std::thread`
什么是std::thread? std::thread是C11中引入的一个类,用于表示和管理线程。通过std::thread,我们可以创建一个新的线程来执行指定的任务。线程是操作系统调度的基本单位,多个线程可以并发执行,从而提高程序的效率。 创…...
体验 DeepSeek-R1:解密 1.5B、7B、8B 版本的强大性能与应用
文章目录 🍋引言🍋DeepSeek 模型简介🍋版本更新:1.5B、7B、8B 的区别与特点🍋模型评估🍋体验 DeepSeek 的过程🍋总结 🍋引言 随着大规模语言模型的持续发展,许多模型在性…...
2024年认证杯SPSSPRO杯数学建模A题(第二阶段)保暖纤维的保暖能力全过程文档及程序
2024年认证杯SPSSPRO杯数学建模 A题 保暖纤维的保暖能力 原题再现: 冬装最重要的作用是保暖,也就是阻挡温暖的人体与寒冷环境之间的热量传递。人们在不同款式的棉衣中会填充保暖材料,从古已有之的棉花、羽绒到近年来各种各样的人造纤维。不…...
P1878 舞蹈课(详解)c++
题目链接:P1878 舞蹈课 - 洛谷 | 计算机科学教育新生态 1.题目解析 1:我们可以发现任意两个相邻的都是异性,所以他们的舞蹈技术差值我们都要考虑,4和2的差值是2,2和4的差值是2,4和3的差值是1,根…...
或非门组成的SR锁存器真值表相关问题
PS:主要是给大家抛砖引玉,不喜勿喷。 问题描述:或非门组成的SR锁存器,为什么当SD和RD等于0时候的真值表一个是Q0,Q0.一个结果是Q1,Q1?...
机器学习算法 - 随机森林之决策树初探(1)
随机森林是基于集体智慧的一个机器学习算法,也是目前最好的机器学习算法之一。 随机森林实际是一堆决策树的组合(正如其名,树多了就是森林了)。在用于分类一个新变量时,相关的检测数据提交给构建好的每个分类树。每个…...
webpack构建流程
文章目录 [TOC](文章目录) 运行流程初始化流程编译构建流程compile编译make 编译模块build module 完成模块编译 输出流程seal输出资源emit输出完成 小结 运行流程 是一个串行的过程,它的工作流程就是将各个插件串联起来 在运行过程中会广播事件,插件只…...
服务器之连接简介(Detailed Explanation of Server Connection)
一台服务器最大能支持多少连接?一台客户端机器最多能发起多少条连接?? 我们知道TCP连接,从根本上看其实就是client和server端在内存中维护的一组【socket内核对象】(这里也对应着TCP四元组:源IP、源端口、…...
第1章大型互联网公司的基础架构——1.5 服务发现
讲到这里,我们已经对一个客户端请求进入业务HTTP服务的过程有了较为详细的了解。业务HTTP服务在处理请求的过程中免不了与其他下游服务通信——可能会调用其他业务服务,可能需要访问数据库,可能会向消息中间件投递消息等,所以业务…...
uniapp PDF 预览和下载
创建 index.vue <template><view><view class"box"><view class"item" ><view class"title"><span></span><text>文件</text></view><view class"list" v-for"(…...
ubuntu服务器部署
关闭欢迎消息 服务器安装好 ubuntu 系统后,进行终端登录,会显示出很多的欢迎消息 通过在用户的根目录下执行 touch .hushlogin 命令,再次登录终端就不会出现欢迎消息 修改hostname显示 修改 /etc/hostname 文件内容为主机名,保…...
Deepseek 本地部署
准备环境 设备:家用笔记本电脑,8核/16G/1Tb SSD/无独显 系统:windows10 软件环境(非源码部署不需要):conda 4.8.5、python3.7、git2.13 步骤 下载安装Ollama 下载地址:OllamaGet up and r…...
[Linux][问题处理]修改密码报You must wait longer to change your password
一、问题描述 在Linux控制台中修改密码,键入旧密码,设置并确认新密码后,却提示You must wait longer to change your password(您必须等待更长时间才能更改密码) 二、原因 当前修改时间 < Minimum number of da…...
《刚刚问世》系列初窥篇-Java+Playwright自动化测试-22- 操作鼠标拖拽 - 下篇(详细教程)
1.简介 上一篇中,宏哥说的宏哥在最后提到网站的反爬虫机制,那么宏哥在自己本地做一个网页,没有那个反爬虫的机制,谷歌浏览器是不是就可以验证成功了,宏哥就想验证一下自己想法,其次有人私信宏哥说是有那种…...
SpringBoot3使用Swagger3
版本 springboot3.4.2 JAVA 17 一、引入Swagger3依赖 <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.0.4</version> </dependency> 二、快速启…...
HCIA综合项目之多技术的综合应用实验
十五 HCIA综合实验 15.1 IP规划 #内网分配网段192.168.1.0 24#内网包括骨干链路和两个用户网段,素以需要划分三个,借两位就够用了192.168.1.0 26--骨干192.168.1.64 26---R1下网络192.168.1.128 26---R2下网络192.168.1.192 26--备用192.168.1.64 26--…...