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

项目中遇到的一些问题总结(六)

Minio

Minio是一个开源的分布式对象存储系统,它使用纠删码技术来保护数据。纠删码技术是一种恢复丢失和损坏数据的数学算法,它将数据分块冗余的分散存储在各个节点的磁盘上,从而提供了一定程度的数据可靠性和冗余性。
在Minio中,所有可用的磁盘组成一个集合,当上传一个文件时,该文件会通过纠删码算法进行分块存储。具体来说,除了将文件本身分成若干个数据块,还会生成若干个校验块。数据块和校验块会分散的存储在这些磁盘上,这样即使某些磁盘出现了故障或损坏,仍然可以通过计算校验块来恢复数据。

例如,如果Minio集合中有8个硬盘,上传一个文件时将其分成4个数据块和4个校验块,然后将它们分别存储在这8个硬盘上。如果其中最多有4个硬盘损坏,Minio仍然可以通过计算校验块来恢复数据,不影响上传和下载操作。但如果有超过4个硬盘损坏,就无法恢复数据了。
因此,Minio使用纠删码技术可以提高数据的可靠性和冗余性,从而保证数据的安全性和可用性。

io.minio:minio:8.4.3

这是MinIO的官方Java客户端,可以用于与MinIO服务器进行交互。该依赖项提供了一组Java API,可以用于创建、读取、更新和删除对象(bucket)、管理桶(bucket)、设置策略、生成预签名URL等操作。使用该依赖项,可以轻松地在Java应用程序中与MinIO进行交互,从而实现文件的上传、下载和管理等功能。

com.squareup.okhttp3:okhttp:4.8.1

这是一个流行的Java HTTP客户端库,用于与HTTP服务器进行交互。在MinIO客户端中,该依赖项用于实现与MinIO服务器的HTTP通信。它提供了一组Java API,可以用于发送HTTP请求和处理HTTP响应。使用该依赖项,可以轻松地在Java应用程序中与MinIO服务器进行通信,从而实现文件的上传、下载和管理等功能。
综上所述,这两个依赖项是Java开发中使用MinIO客户端必备的组件,可以方便地实现与MinIO服务器的交互和数据传输。

Minio如何验证下载的文件完整正确?

Minio使用纠删码技术来保证数据的完整性和可靠性。在下载文件时,Minio客户端会自动计算文件的校验和,并与Minio服务器上存储的校验和进行比较,以验证文件的完整性。如果两个校验和不匹配,则说明文件可能已被篡改或损坏。
在Java中,可以使用Minio Java客户端提供的getObject方法来下载文件,并通过比较文件的MD5校验和来验证文件的完整性。以下是一个示例代码:

import io.minio.MinioClient;
import io.minio.errors.MinioException;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.codec.binary.Hex;
public class MinioDownloadExample {public static void main(String[] args) throws NoSuchAlgorithmException {String endpoint = "http://localhost:9000";String accessKey = "YOUR_ACCESS_KEY";String secretKey = "YOUR_SECRET_KEY";String bucketName = "test-bucket";String objectName = "test-object";try {// Initialize Minio clientMinioClient minioClient = new MinioClient.Builder().endpoint(endpoint).credentials(accessKey, secretKey).build();// Download object and get input streamInputStream inputStream = minioClient.getObject(bucketName, objectName);// Calculate MD5 hash of downloaded objectMessageDigest md5Digest = MessageDigest.getInstance("MD5");byte[] buffer = new byte[8192];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {md5Digest.update(buffer, 0, bytesRead);}byte[] md5Bytes = md5Digest.digest();String downloadedMd5 = Hex.encodeHexString(md5Bytes);// Get MD5 hash of original objectString originalMd5 = minioClient.statObject(bucketName, objectName).etag();// Compare MD5 hashes to verify file integrityif (originalMd5.equals(downloadedMd5)) {System.out.println("File downloaded successfully and verified.");} else {System.out.println("File download failed or file has been modified.");}} catch (MinioException | IOException e) {System.out.println("Error occurred: " + e.getMessage());e.printStackTrace();}}
}

在这个示例代码中,我们使用了Minio Java客户端的getObject方法来下载指定的对象,并通过计算MD5校验和来验证文件的完整性。在计算MD5校验和时,我们使用了Java标准库中的MessageDigest类,并将输入流读入缓冲区中以进行计算。最后,我们将下载的文件的MD5校验和与Minio服务器上存储的对象的MD5校验和进行比较,以验证文件的完整性。

MYSQL可重复读

MySQL的事务隔离级别中,可重复读(Repeatable Read)是比较严格的隔离级别之一。在可重复读级别下,一个事务中多次读取同一个数据,将返回同样的结果,而不受其他并发事务对该数据的影响。也就是说,已提交的事务对于其他事务是不可见的,除非它们自己也已经提交。

在MySQL的可重复读隔离级别下,会通过在读取数据时,对数据进行加锁的方式来实现事务的隔离性。这样可以保证事务中的数据操作不被其他事务干扰,同时也可以保证数据的一致性。

在可重复读隔离级别下,其他事务只能读取已经提交的数据,而不能读取当前事务修改了但未提交的数据。因此,在这种隔离级别下,可以避免脏读、不可重复读和幻读等并发问题。

但是,可重复读隔离级别也有一定的缺点。由于事务需要对数据进行加锁,因此可能会对并发性能造成一定的影响。另外,如果一个事务长时间占用了锁资源,可能会阻塞其他事务的执行。因此,在实际应用中,需要根据业务的需要来选择合适的事务隔离级别。

如果是可重复读,第一个事务开启期间,第二个事务修改了某个数据并提交,第一个事务是读取不到修改内容吗

在MySQL的可重复读隔离级别下,如果在第一个事务开启期间,第二个事务修改了某个数据并提交了,那么第一个事务是无法读取到第二个事务对该数据所做的修改的。第一个事务只能读取到在它自己开启期间已经提交的数据。

这是因为MySQL的可重复读隔离级别通过MVCC (多版本并发控制)来实现。在这种机制下,每一个事务都会看到一个与其开启时一样的快照,也就是说,每一个事务都可以读取已经提交的数据,但是无法读取其他事务正在修改但未提交的数据。因此,即使在第一个事务开启期间,第二个事务对某个数据做了修改,但是由于这个修改还没有提交,因此第一个事务仍然无法读取到它。

当然,如果第二个事务回滚了这个修改操作,那么第一个事务在后续的查询操作中就可以看到这个修改被回滚的结果。因此,在可重复读隔离级别下,虽然无法读取其他事务正在修改的数据,但是仍然存在一定程度的幻读问题。

第二个事务的数据已经提交了,为什么第一个还看不到

如果第二个事务的数据已经提交了,而第一个事务仍然无法读取到这个数据,可能是因为第一个事务在读取时使用了MySQL的读取一致性视图(consistent read view)。在MySQL的MVCC机制中,每个事务在执行时都会创建自己的一致性视图,用于保证事务操作的读取一致性。

在可重复读隔离级别下,当一个事务开始执行时,它会创建一个一致性视图,这个视图包含了事务开始时所有已提交事务的快照。而在事务执行期间,其他事务所做的修改不会影响这个一致性视图。如果第二个事务已经提交了数据,在第一个事务的一致性视图中是看不到这个数据的修改的,因此也无法读取到修改后的数据。

需要注意的是,尽管第一个事务无法读取到修改后的数据,但第二个事务的修改是已经生效的,其他事务在读取该数据时,是可以读取到修改后的数据的。只有第一个事务的一致性视图没有包含该修改时,事务读取的数据才是旧的数据。

那这样第一个事务使用旧数据不会有影响吗

如果第一个事务使用旧数据,可能会产生一些问题。假设第一个事务读取了一个旧的数据,而该数据在第二个事务中已经被修改成新的值。如果第一个事务继续执行更新操作,会将旧的值更新到数据库中,从而覆盖了第二个事务所做的修改。

这种问题被称为“丢失更新”(Lost Update),是并发环境中常见的问题之一。为了避免这种问题,可以使用加锁来保证多个事务不会同时更新同一条数据。在MySQL中,可以使用行级锁(如行锁和间隙锁)或表级锁(如表锁)来控制并发访问。

另外,如果在可重复读隔离级别下需要读取最新的数据(即使已经开启了事务),可以使用SELECT … FOR UPDATE或SELECT … LOCK IN SHARE MODE语法来加锁,从而读取最新的数据并阻止其他事务对该数据进行修改。

既然这样,可重复读的意义是什么?

可重复读隔离级别的基本含义是:一个事务在执行期间看到的数据总是跟它在事务开始时看到的数据相同,即保持读取的一致性。这意味着,在某个事务中读取的数据,在该事务执行期间不会被其他事务所修改。这种隔离级别可以保证事务的读一致性,避免了出现“脏读”(dirty read)、“不可重复读”(non-repeatable read)和“幻读”(phantom read)等问题。

对于一些对数据一致性要求较高的应用,比如账务系统、库存管理等业务,可重复读隔离级别具有非常重要的意义。因为采用该隔离级别的应用,可以保证在事务中读取的数据总是一致的,不会受到其他并发事务的影响,从而大大降低了数据异常的可能性。

当然,可重复读隔离级别并不能完全消除并发访问带来的问题,如上述的丢失更新、死锁等情况仍有可能发生,需要开发人员在编写应用程序时加以避免或处理。

可重复读的实现原理

MySQL数据库中,可重复读隔离级别的实现主要依赖于以下两种机制:

  1. 数据快照

在事务启动时,MySQL会为该事务创建一个独立的存储空间,称之为“事务视图”(Transaction Snapshot)。该存储空间包含了当前系统中所有数值偏移量小于等于该事务启动时间的数据行版本。在该事务执行过程中,除了被该事务修改的数据以外,它对数据的读取都是从事务视图中读取的,而不直接读取数据库中的数据。因此,该事务在执行期间能够看到的数据总是跟它在事务开始时看到的数据相同。

  1. 行级锁和多版本并发控制

为了保证事务执行期间的数据一致性,MySQL在可重复读隔离级别下使用了多版本并发控制(Multiversion Concurrency Control,MVCC)机制。该机制允许多个事务在不同的版本上并发读取和修改同一个数据行。

具体来讲,MySQL为每个被修改的数据行创建一个事务版本号,每个事务的修改都会产生一个新的版本,被修改的数据行也会被标记为“已经修改”。而其他事务在读取该数据行时,只能读取该数据行的未被修改的版本,因为修改后的版本对它们都是不可见的。对于已经被修改的数据行,在其他事务中读取该数据行时,会根据该事务的隔离级别和创建时间决定如何处理。例如,如果是可重复读隔离级别,将从视图中读取相应的版本号。

除了数据快照和MVCC机制,MySQL还使用了行级锁来避免多个事务同时修改同一个数据行而导致的数据不一致问题。行级锁分为共享锁和排他锁两种,共享锁用于读操作,排他锁用于写操作。在可重复读隔离级别下,MySQL会自动给所有的SELECT语句加上共享锁,以保证事务期间读取的数据不会受到其他事务的修改影响。而在写操作时,则需要使用到排他锁,来保证只有该事务能够修改对应的数据行。这就保证了在可重复读隔离级别下的数据一致性。

详细介绍第二种机制

第二种机制是MySQL在可重复读隔离级别下使用的多版本并发控制(Multiversion Concurrency Control,MVCC)机制。该机制允许多个事务在不同的版本上并发读取和修改同一个数据行,以保证事务的隔离性,并发性和一致性。

MVCC实现的核心思想是:对于每个事务,不直接读取数据库中的数据,而是创建一个“事务版本”,在事务版本集(Transaction Version Set)中记录该事务读取的所有数据行的版本号。在读取数据时,会将该数据行的版本号和该事务的版本号作比较,以判断是否可以进行读取。在修改数据时,会为该数据行创建一个新的版本号,并将新的版本号和事务版本集中的版本号做比较,以判断是否可以进行修改。

具体来说,MVCC机制通常涉及到以下几个概念:

  1. 版本号:每个数据行都会有一个版本号,用来标识该数据行的修改情况。MySQL中的版本号实际上就是每个事务提交的时间戳,也称之为系统版本号(System Version Number,SVN)。

  2. 事务版本集:每个事务都有一个事务版本集,它存储了该事务所读取的所有数据行的版本号。

  3. 可见性规则:指定了在什么情况下,一个事务能够看到一个数据行的版本。在可重复读隔离级别下,只有一个事务启动时已经存在的版本才是可见的,即该事务启动时已经提交的事务版本。而其他事务所做的修改,则对该事务是不可见的。

  4. 回滚段:MySQL通过回滚段(Undo Log Segment)来实现对MVCC机制的支持。每个回滚段都有一个唯一ID,用来标识一组回滚段。

通过以上机制的支持,MySQL在可重复读隔离级别下可以实现对并发事务的控制,保证了每个事务只能读取到在启动时已经存在的数据版本号,并在修改时为其分配新的版本号。这种方式可以避免"不可重复读"和"脏读"等问题的出现,从而保证了数据的一致性和隔离性。

相关文章:

项目中遇到的一些问题总结(六)

Minio Minio是一个开源的分布式对象存储系统,它使用纠删码技术来保护数据。纠删码技术是一种恢复丢失和损坏数据的数学算法,它将数据分块冗余的分散存储在各个节点的磁盘上,从而提供了一定程度的数据可靠性和冗余性。 在Minio中,…...

Linux线程5——生产消费模型

生产消费模型 1个交易场所:超市 2种角色:生产者/消费者 3种关系:生产者和生产者(竞争关系也叫互斥关系),消费者和消费者(竞争关系同样是互斥关系),生产者和消费者(互斥,同步关系:生产完再消费或消费完再生产)。 以上是生产消费模型遵守的“321”原则。 生产者和消…...

Vue + Springboot 文件上传项目笔记(一)

Vue Springboot 文件上传项目笔记(一) 前端 使用脚手架创建项目 vue create vue_fileuploaddemo等待命令执行完毕添加 element-ui 组件 E:\java\idea_java_maven\vue_fileuploaddemo>yarn add element-ui yarn add v1.22.19 [1/4] Resolving pac…...

【华为OD机试真题2023B卷 JAVA】座位调整

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 座位调整 知识点迭代 时间限制:1s 空间限制:256MB 限定语言:C(clang11), C++(clang++11), Java(javac 1.8), Python3(3.9), JavaScript Node(12.18.2), Go(1.14.4) 题目描述: 疫情期间课堂的座位进行了特殊的调整,不能出…...

Python 学习 2022.08.28 周日

文章目录 一、 概述1.1) 之前写的文章:1.2) 基础点1.3) 配置1.4) Python2 和 Python3 的区别1.5) 相关问题跟踪解决1.6) 其他 一、 概述 1.1) 之前写的文章: 【Python大系】Python快速教程《Python 数据库 GUI CGI编…...

WEB自动化测试,一定得掌握的8个核心知识点

​ 编辑 写在前面 使用 cypress 进行端对端测试,和其他的一些框架有一个显著不同的地方,它使用 JavaScript 作为编程语言。 传统主流的 selenium 框架是支持多语言的,大多数 QA 会的 python 和 Java 语言都可以编写 selenium 代码&#xff0…...

期末复习总结!!【MySQL】库和表的基本操作 + 增删改查CURD

文章目录 前言一、数据库的基本操作1, 查看库2, 创建库3, 使用库4, 删除库 二、表的基本操作1, 创建表2, 查看表3, 查看表结构4, 删除表 三、增加(Create)四、查询(Retrieve) (重点)1, 全列查询2, 指定列查询3, 查询字段为表达式4, 指定别名5, 去重6, 排序7, 条件查询7.1, 基本…...

线上问题处理案例:出乎意料的数据库连接池 | 京东云技术团队

导读 本文是线上问题处理案例系列之一,旨在通过真实案例向读者介绍发现问题、定位问题、解决问题的方法。本文讲述了从垃圾回收耗时过长的表象,逐步定位到数据库连接池保活问题的全过程,并对其中用到的一些知识点进行了总结。 一、问题描述…...

有了 IP 地址,为什么还要用 MAC 地址?

MAC地址等价于快递包裹上的收件人姓名。 MAC地址更多是用于确认对方信息而存在的。就如同快递跨越几个城市来到你面前,快递员需要和你确认一下收件人是否正确,才会把包裹交给你一样。 IP66在线查IP地址位置:https://www.ip66.net/?utm-sour…...

ChatGPT 推出 iOS 应用,支持语音输入,使用体验如何?

最近,OpenAI 宣布推出官方 iOS 应用,允许用户随时随地访问其高人气 AI 聊天机器人,此举也打破了近几个月内苹果 App Store 上充斥似是而非的山寨服务的窘境。 该应用程序是 ChatGPT 的首个官方移动应用程序。ChatGPT 软件程序在去年推出后迅速…...

【科普】干货!带你从0了解移动机器人(二)—— 移动机器人硬件组成

移动机器人是一个多功能于一体的综合系统,内容涵盖了传感器技术、自动化技术、信息处理、电子工程等,它集环境感知、动态决策与规划于一体,是目前科学技术发展最活跃的领域之一。移动机器人的各种组件之间需要协同工作才能实现机器人的自主移…...

WIN提权 令牌窃取进程注入

令牌窃取(鸡肋玩意 2008包括2008以下) 令牌,又叫token,是系统临时产生的秘钥,相当于账号密码,用来决定是否允许此次请求和判断此次请求是属于哪一个用户。 win7一下的版本可以尝试 这里使用msf上自带的令…...

CSS 提高性能的方法,并提供一些实用的技巧和代码示例

CSS 是前端开发中不可或缺的一部分,它负责网页的样式和布局。随着网站规模和复杂度的增加,CSS 的性能也变得越来越重要。本文将介绍 CSS 提高性能的方法,并提供一些实用的技巧和代码示例。 使用压缩后的 CSS 文件 压缩 CSS 文件可以减小文件…...

程序员:面试造火箭,入职拧螺丝?太难了···

刚开始工作的时候,我也想不通这个问题,甚至很鄙视这种现象。后面当了面试官,做到了公司中层管理,也会站在公司以及行业角度去重新思考这个问题。 为什么这种现象会越来越普遍呢?尤其在 IT 行业愈加明显。 面试看的是…...

pg事务:隔离级别历史与SSI

事务隔离级别的历史 ANSI SQL-92定义的隔离级别和异常现象确实对数据库行业影响深远,甚至30年后的今天,绝大部分工程师对事务隔离级别的概念还停留在此,甚至很多真实的数据库隔离级别实现也停留在此。但后ANSI92时代对事物隔离有许多讨论甚至…...

【滑动窗口】【单调队列】个人练习-Leetcode-2373. Largest Local Values in a Matrix

题目链接:https://leetcode.cn/problems/largest-local-values-in-a-matrix/ 题目大意:给出一个N*N矩阵,要求做池化操作,选出每个3*3矩阵的最大值,返回一个(N-2)*(N-2)矩阵 思路:这是个简单题&#xff0c…...

工厂蓝牙定位技术的原理、应用场景、优势及潜在问题

蓝牙定位技术是近年来在工业领域中得到广泛应用的一项技术。随着工业自动化的快速发展和物联网技术的普及,工厂蓝牙定位成为了提高生产效率、优化生产流程和管理的重要工具。本文将详细介绍工厂蓝牙定位技术的原理、应用场景以及其在工业生产中的优势。 首先&#x…...

Linux内核模块编程

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 1 总体设计思路 Linux内核是单体式结构,相对于微内核结构而言,其运行效率高,但是系统的可维护性和可扩展性较差。为此,Linux提供了内核模块(module)机制&…...

每日一练 | 网络工程师软考真题 Day8

1、某客户端采用ping命令检测网络连接故障时,发现可以ping通127.0.0.1及本机的IP地址,但无法ping通同一网段内其他工作正常的计算机的IP地址。该客户端的故障可能是 。 A.TCP/IP协议不能正常工作 B.本机网卡不能正常工作 …...

springBoot如何【禁用Swagger】

需求: 生产环境下,需要关闭swagger配置,避免接口暴露。 方法: 1、使用注解Value() 2、使用注解Profile({“dev”,“test”}) 表示在开发或测试环境开启,而在生产关闭。 3、使用注解ConditionalOnProperty(name “s…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制&#xff0…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

三体问题详解

从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

网络编程(UDP编程)

思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...