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

分布式文件存储Minio学习入门

文章目录

  • 一、分布式文件系统应用场景
    • 1. Minio介绍
      • Minio优点
    • 2. MinIO的基础概念、
    • 3. 纠删码ES(Erasure Code)
    • 4. 存储形式
    • 5. 存储方案
  • 二、Docker部署单机Minio
  • 三、minio纠删码模式部署
  • 四、分布式集群部署
    • 分布式存储可靠性常用方法
      • 冗余
      • 校验
    • 分布式Minio优势
    • 运行分布式minio
    • 使用docker compose部署minio
  • 五、Minio客户端使用
    • docker 中使用MC
  • 六、Minio整合SpringBoot
    • 1. 编写MinioConfig类
    • 2. 编写application.yml
    • 3. 编写Controller测试类(查询、下载、上传)

一、分布式文件系统应用场景

互联网海量非结构化数据的存储需求。电商图片、视频、网盘文件、社交图片。
分布式文件存储系统Minio与FastDFS的区别。FastDFS文件名是自动生成的。

1. Minio介绍

MinIO是一个开源的对象存储服务。兼容亚马逊S3云存储服务接口。适合存储大量非结构化数据,eg:图片、视频、日志文件、备份数据、容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几K到最大5T不等。
MinIO是一个非常轻量的服务,可以很简单的和其他应用结合,类似NodeJS、Redis或者MySQL。
中文官方网站:http://minio.org.cn/

Minio优点

  • 部署简单:一个single二进制文件即是一切,还可支持各种平台
  • minio支持海量存储,可按zone扩展,支持单个对象最大5TB
  • 兼容Amazon S3,充分考虑开发人员的需求和体验
  • 低冗余且磁盘损坏高容忍,标准且最高的数据荣誉系数为2(即存储一个1M的数据,实际占用2M),但在任意n/2块disk损坏的情况下依赖可以读出数据(n为一个纠删码集合中的disk数量)。并且这种损坏恢复是基于单个对象的,而不是基于整个存储卷的。
  • 读写性能优异

2. MinIO的基础概念、

  • Object: 存储到MinIO的基本对象,如文件、字节流等
  • Bucket: 用来存储Object的逻辑空间。每个Bucket之间的数据是相互隔离的。对于客户端来说,相当于一个存放文件的顶层文件夹。(隔离的作用)
  • Drive: 即存储数据的磁盘,在Minio启动时,以参数的方式传入。Minio中所有的对象数据都会存储在Drive中。
  • Set: 即一组Drive的集合,分布式部署根据集群规模自动划分一个或多个Set,每个Set中的Dirve分布位置不同。一个对象存储在一个Set上。
    • 一个对象存储在一个Set上
    • 一个集群划分为多个Set
    • 一个Set包含的Drive数量固定,默认由系统根据集群规模计算
    • 一个Set中的Drive尽可能分布在不同的节点上。

3. 纠删码ES(Erasure Code)

MinIO使用纠删码机制来保证高可用,使用HighWayHash来处理数据损坏。关于纠删码,简单的说即通过计算,将丢失的数据还原,可以将n份原始数据,增加m份数据。并能通过n+m份中的任意n份数据,还原为原始数据。
即如果有任意小于m份的数据失败,仍可以通过剩下的数据还原。

4. 存储形式

文件对象上传到Minio,会在对应的数据磁盘中,以Bucket名称为目录,文件名为下一级目录,文件名下为part.1和xl.meta,前者为编码数据块及校验块,后者是元数据文件。

5. 存储方案

在这里插入图片描述

二、Docker部署单机Minio

  1. 参考官方文档:https://min.io/docs/minio/container/index.html
    在这里插入图片描述
  2. 命令启动
    这里我们用的是docker,所以需要将命令换成docker run
λ docker search minio
λ docker pull minio/minio
docker run -p 9000:9000 -p 9090:9090 --name minio -v D:\docker\minio\data:/data -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=admin123" minio/minio server /data --console-address ":9090"
# 下面是多行模式的
docker run -d 	\ 	# 后台启动-p 9000:9000  \	# api-p 9090:9090  \	# 访问地址--name minio -v D:\docker\minio\data:/data  \		#映射数据文件-e "MINIO_ROOT_USER=admin"  \		#账号-e "MINIO_ROOT_PASSWORD=admin123"  \		#密码minio/minio server /data --console-address ":9090"	#指定访问端口9090不变更

启动控制台打印内容:
在这里插入图片描述

  1. 访问:http://localhost:9090/login 账号:admin,密码:admin123

  2. 创建存储桶,并上传文件测试,查看映射磁盘目录的变化。
    在这里插入图片描述
    这里我参考的版本是说单台没有启用纠删码存储的即为源文件,而我这里docker启动的却存储的是

    λ tree
    D:\docker\minio\data
    └─test1└─Doc1.docx└─f9014ffb-63fd-4f5d-a250-fbccf131f87d
    

三、minio纠删码模式部署

minio使用纠删码(erasure code)与校验和(checksum)来保护数据不受硬件故障和无声数据损坏。即使丢失一半(n/2)数据的硬盘,仍然可以恢复数据。当有一半的磁盘损坏时数据无法上传,必须存在2n+1块才可以。

  1. docker 部署
docker run -p 9000:9000 -p 9090:9090 --name minio -v D:\docker\minio\data1:/data1 -v D:\docker\minio\data2:/data2 -v D:\docker\minio\data3:/data3 -v D:\docker\minio\data4:/data4  -v D:\docker\minio\data5:/data5 -v D:\docker\minio\data6:/data6 -v D:\docker\minio\data7:/data7 -v D:\docker\minio\data8:/data8 -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=admin123" minio/minio server /data{1...8} --console-address ":9090"docker run -d 	\ 	# 后台启动-p 9000:9000  \	# api-p 9091:9091  \	# 访问地址--name minio -v D:\docker\minio\data1:/data1 \-v D:\docker\minio\data2:/data2 \-v D:\docker\minio\data3:/data3 \-v D:\docker\minio\data4:/data4 \-v D:\docker\minio\data5:/data5 \-v D:\docker\minio\data6:/data6 \-v D:\docker\minio\data7:/data7 \-v D:\docker\minio\data8:/data8 \-e "MINIO_ROOT_USER=admin"  \		#账号-e "MINIO_ROOT_PASSWORD=admin123"  \		#密码minio/minio server /data{1...8} --console-address ":9091"	#指定访问端口9090不变更

四、分布式集群部署

分布式minio可以将多块硬盘组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式minio避免了单点故障。
在这里插入图片描述

分布式存储可靠性常用方法

分布式存储,关键点在于数据可靠性、完整性、不丢失损坏。只有在可靠的前提下才追求一致性、高可用、高性能。

冗余

冗余即对存储的数据进行备份,当数据丢失、损坏,可以使用副本进行恢复。而备份份数决定了可靠性。可靠性是允许丢失其中一部分数据。当前分布式系统中采用该模式的,eg:Hadoop的文件系统(3个副本)、Redis集群、Mysql主备。

校验

校验即通过校验码的计算方式,对丢失损坏的数据进行校验、还原。注意:这里有两个作用,一个校验通过对数据进行校验和计算,可以检查数据的完整性,检查数据是否损坏、更改,在数据传输中使用。二是恢复还原,通过对数据结合校验码计算,还原丢失损坏的数据,在保证可靠性的前提下减少冗余。eg:单机硬盘存储的RAID技术、纠删码技术。

分布式Minio优势

  • 数据保护:分布式minio采用纠删码来防范多个节点宕机和位衰减(bit rot)。分布式minio最少需要4个磁盘,使用分布式minio自动引入纠删码。
  • 高可用:单机minio存在单点故障。而如果一个有N块硬盘的分布式minio,只要有n/2块硬盘可用,则数据安全可读。可写需要n/2+1。
  • 一致性:minio在分布式和单机模式下,所有写操作都严格遵守read-after-write一致性。

运行分布式minio

启动一个分布式minio实例,只需要把硬盘位置作为参数传给minio server命令即可,然后在其他节点运行相同命令。

  • 分布式minio所有节点需要同样的access密钥和secret密钥以保证所有节点可以建立连接。新版(MINIO_ROOT_USER、MINIO_ROOT_PASSWORD)
  • 分布式 minio使用磁盘必须干净无数据。
  • 分布式minio节点时间差不得超过3秒,可以使用NTP来保证时间同步。
    在这里插入图片描述
    在这里插入图片描述

使用docker compose部署minio

version: '3.7'# Settings and configurations that are common for all containers
x-minio-common: &minio-commonimage: minio/minio:latestcommand: server --console-address ":9001" http://minio{1...4}/data{1...2}expose:- "9000"- "9001"environment:MINIO_ROOT_USER: minioMINIO_ROOT_PASSWORD: minio123healthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3# starts 4 docker containers running minio server instances.
# using nginx reverse proxy, load balancing, you can access
# it through port 9000.
services:minio1:<<: *minio-commonhostname: minio1volumes:- data1-1:/data1- data1-2:/data2minio2:<<: *minio-commonhostname: minio2volumes:- data2-1:/data1- data2-2:/data2minio3:<<: *minio-commonhostname: minio3volumes:- data3-1:/data1- data3-2:/data2minio4:<<: *minio-commonhostname: minio4volumes:- data4-1:/data1- data4-2:/data2nginx:image: nginx:1.19.2-alpinehostname: nginxvolumes:- ./nginx.conf:/etc/nginx/nginx.conf:roports:- "9000:9000"- "9001:9001"depends_on:- minio1- minio2- minio3- minio4## By default this config uses default local driver,
## For custom volumes replace with volume driver configuration.
volumes:data1-1:data1-2:data2-1:data2-2:data3-1:data3-2:data4-1:data4-2:

五、Minio客户端使用

MinIO Client(MC)为ls、cat、cp、mirror、diff、find等unix命令提供了一种替代方案。

ls 			#	列出文件和文件夹。
mb			#	创建一个存储桶或一个文件夹。
cat			#	显示文件和对象内容。
pipe		#	将一个STDIN重定向到一个对象或者文件或者STDOUT。
share		#	生成用于共享的URL。
cp			#	拷贝文件和对象。
mirror		#	给存储桶和文件夹做镜像。
find		#	基于参数查找文件。
diff		#	对两个文件夹或者存储桶比较差异。
rm			#	删除文件和对象。
events		#	管理对象通知。
watch		#	监视文件和对象的事件
policy		#	管理访问策略。
config		#	管理mc配置文件。
update		#	检查软件更新。
version		# 	输出版本信息。

http://docs.minio.org.cn/minio/baremetal/reference/minio-cli/minio-mc.html

docker 中使用MC

启动控制台

λ docker pull minio/mc
λ docker run -it --name mc --entrypoint=/bin/sh minio/mc
λ docker start -i mc

配置管理

# 查询mc host配置
mc config host ls
# 添加minio服务
mc config host add minio-server http://172.17.0.3:9090 admin admin123
# 删除host
mc config host remove minio-server

文件管理

# 上传下载
mc cp 源文件地址 目标地址
mc rm 文件地址

Bucket管理

# 创建桶
mc mb hostname / bucketName
eg:mc mb minio-server /bucket01
# 删除桶 --force表示强制删除
mc rb hostname  /bucketName
eg:mc rb --force minio-server /bucket02

admin管理

service		# 服务重启并停止所有MinIO服务器
update		# 更新所有MinIO服务器
info		# 显示MinIO服务器信息
user		# 管理用户
group		# 管理小组
policy		# MinIO服务器中定义的策略管理
config		# MinIO服务器配置管理
heal		# 修复MinIO服务器上的磁盘,存储桶和对象
profile		# 生成概要文件数据以进行调试
top			# 提供MinIo的顶部统计信息
trace		# 跟踪显示MinIO服务器的http跟踪
console			# 控制台显示MinIo服务器的控制台日志
prometheus		# Prometheus管理Prometheus配置
kms				# kms执行KMS管理操作

六、Minio整合SpringBoot

1. 编写MinioConfig类

@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {private String url;private String username;private String pwd;@Beanpublic MinioClient getMinioClient() {MinioClient minioClient = MinioClient.builder().endpoint(this.getUrl()).credentials(this.getUsername(), this.getPwd()).build();return minioClient;}
}

2. 编写application.yml

minio:url: http://localhost:9000username: adminpwd: admin123bucket: test
server:port: 8888
spring:servlet:multipart:max-file-size: 100MBmax-request-size: 500MB

3. 编写Controller测试类(查询、下载、上传)

@RestController
@Slf4j
public class MinioController {@Autowiredprivate MinioClient minioClient;@Value("${minio.bucket}")private String bucketName;@GetMapping("/list")public List<Object> list() throws Exception {Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build());ArrayList<Object> list = new ArrayList<>();Iterator<Result<Item>> iterator = results.iterator();while (iterator.hasNext()) {Item item = iterator.next().get();list.add(JSONUtil.parse(this.format(item.objectName(), item.size())));}return list;}@GetMapping("/download/{fileName}")public void download(HttpServletResponse resp, @PathVariable("fileName") String fileName) throws Exception {StatObjectResponse stat = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(fileName).build());resp.setContentType(stat.contentType());resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));GetObjectResponse object = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());IOUtils.copy(object, resp.getOutputStream());}@GetMapping("/delete/{fileName}")public String delete(@PathVariable("fileName") String fileName) {try {minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());} catch (Exception e) {e.printStackTrace();return "删除失败!" + e.getMessage();}return "删除成功!";}@GetMapping("/upload")public String upload(MultipartFile[] files) throws IOException {if (files == null || files.length == 0) {return "上传文件不能为空!";}InputStream ins = null;try {ArrayList<String> fileNames = new ArrayList<>(files.length);for (MultipartFile file : files) {String filename = file.getOriginalFilename();fileNames.add(filename);ins = file.getInputStream();ObjectWriteResponse response = minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(filename).stream(ins, file.getSize(), -1).contentType(file.getContentType()).build());}} catch (Exception e) {e.printStackTrace();return "上传失败!" + e.getMessage();} finally {if (ins != null) {ins.close();}}return "上传成功!";}private String format(String objectName, long size) {return String.format("{'fileName':'%s','fileSize':'%d'}", objectName, size);}
}

相关文章:

分布式文件存储Minio学习入门

文章目录一、分布式文件系统应用场景1. Minio介绍Minio优点2. MinIO的基础概念、3. 纠删码ES(Erasure Code)4. 存储形式5. 存储方案二、Docker部署单机Minio三、minio纠删码模式部署四、分布式集群部署分布式存储可靠性常用方法冗余校验分布式Minio优势运行分布式minio使用dock…...

handler解析(4)-Message及Message回收机制

Message中可以携带的信息 Message中可以携带的数据比较丰富&#xff0c;下面对一些常用的数据进行了分析。 /*** 用户定义的消息代码&#xff0c;以便当接受到消息是关于什么的。其中每个Hanler都有自己的命名控件&#xff0c;不用担心会冲突*/ public int what; /*** 如果你…...

Linux使用定时任务监控java进程并拉起

需求描述&#xff1a; 设计一个脚本&#xff0c;通过Linux定时任务&#xff0c;每分钟执行一次&#xff0c;监控jar包进程是否存在&#xff0c;存在则不做动作&#xff0c;不存在则重新拉起jar包程序。 定时任务配置&#xff1a; */1 * * * * bash -x /root/myfile/jars/che…...

Win 10电脑摄像头提示错误代码0xa00f4244怎么办?

如果你的Windows 10电脑无法打开摄像头&#xff0c;提示“我们找不到你的摄像头”的错误消息&#xff0c;错误代码是0xA00F4244&#xff0c;原因可能是杀毒软件阻止了摄像头&#xff0c;或者是摄像头驱动程序有问题。 小编为你整理了摄像头错误代码0xA00F4244的解决方法&#…...

MFC消息机制

1.消息映射消息映射是一个将消息和成员函数相互关联的表。比如&#xff0c;框架窗口接收到一个鼠标左击消息&#xff0c;MFC将搜索该窗口的消息映射&#xff0c;如果存在一个处理WM_LBUTTTONDOWN消息的处理程序&#xff0c;然后就调用OnButtonDown。2.消息映射机制2.1 声明宏 写…...

全国计算机等级考试报名照片要求以及证件照制作教程

马上就全国计算机等级考试就要开始了&#xff0c;相信现在很多同学都在网上进行报名呢&#xff0c;报名的时候肯定需要用到个人证件照片&#xff0c;所以问题来了&#xff0c;我们怎么自己制作证件照片呢&#xff1f;计算机等级考试报名时对证件照都有哪些要求呢&#xff1f;该…...

SQLSERVER 临时表和表变量到底有什么区别?

一&#xff1a;背景 1. 讲故事 今天和大家聊一套面试中经常被问到的高频题&#xff0c;对&#xff0c;就是 临时表 和 表变量 这俩玩意&#xff0c;如果有朋友在面试中回答的不好&#xff0c;可以尝试看下这篇能不能帮你成功迈过。 二&#xff1a;到底有什么区别 1. 前置思…...

技术生态异军突起,昇思MindSpore进入AI框架第一梯队

ChatGPT掀起的新一轮人工智能狂欢下&#xff0c;隐藏在背后的“大模型”正进入越来越多开发者的视野。 诚如几年前开始流行的一种说法&#xff1a;数据是燃料、模型是引擎、算力是加速器。ChatGPT的出现&#xff0c;恰如其分地诠释了数据、模型和算力的“化学反应”。而在其中…...

审批流、工作流、业务流

是业务流、工作流、审批流 业务流&#xff1a;即业务流程&#xff0c;指为了完成某项业务而进行的各种工作的有序组合 工作流&#xff1a;即工作流程&#xff0c;指为了完成某项工作而进行的各种动作的有序组合 审批流&#xff1a;即审批流程&#xff0c;是对某项工作的审批活动…...

如何利用知识库加强内部管理?

许多公司都知道需要有一个面向客户的知识库&#xff0c;以加强客户服务&#xff0c;提供更好的客户体验。 但是很多企业没有意识到的是&#xff0c;拥有一个内部知识库软件对于员工改善沟通和促进知识共享的重要性。 协作是组织成功的关键部分&#xff0c;通过明确的远景和使…...

饕餮 NFT 作品集来袭!

饕餮 NFT 作品集包含 Chili Game 创作的体验《饕餮》第一章中的角色。可以在 The Sandbox 农历新年活动期间&#xff08;01/18/23 至 02/28/23&#xff09;体验。 饕餮的故事植根于中国古代神话&#xff0c;主要灵感来自《山海经》&#xff0c;一个关于捉妖人「青蛙侠」的故事。…...

C++中的内存分区、引用、函数

内存分区模型 代码区 存放CPU执行的机器指令代码区是共享的且具有只读性 全局区 全局变量和静态变量都存放在此处全局区还包括了常量区、字符串常量和其他常量也存放在此该区域的数据在程序结束后由操作系统释放const修饰的局部变量并不算在全局区 栈区 由编译器自动分配和释放…...

关于angular表格total模板中一直为0

哈喽 小伙伴们大家好昨天在用angular得antdesign组件得table表格 我用total模板 结果&#xff0c;total一直为0这可是愁坏我了 <ng-template #totalTemplate let-total>找到 {{ total }} 条结果</ng-template>[nzShowTotal]"totalTemplate"最后找到原因了…...

多线程事务怎么回滚

背景介绍1&#xff0c;最近有一个大数据量插入的操作入库的业务场景&#xff0c;需要先做一些其他修改操作&#xff0c;然后在执行插入操作&#xff0c;由于插入数据可能会很多&#xff0c;用到多线程去拆分数据并行处理来提高响应时间&#xff0c;如果有一个线程执行失败&…...

基于FPGA的时间数字转换(TDC)设计(五:基于Carry4的高精度TDC设计)

1.基于Carry4进位链设计原理 常见的基于FPGA开发的TDC有直接计数法,多相位时钟采样法,抽头延迟线法等,之前内容为基于多相位的TDC,本章节中,主要讲解基于抽头延迟线法。在Xilinx FPGA开发中,实现抽头延迟线法有很多种,如使用IODELAY构建延迟进位链,此处将介绍基于Carr…...

【C++】二叉搜索树的实现(递归和非递归实现)

文章目录1、二叉搜索树1.1 构建二叉搜索树1.2 二叉搜索树的插入1.3 二叉搜索树的删除1.4 二叉搜索树插入和删除的递归实现为了学习map和set的底层实现&#xff0c;需要知道红黑树&#xff0c;知道红黑树之前需要知道AVL树。 红黑树和AVL树都用到了二叉搜索树结构&#xff0c;所…...

春招来了,如何正确使用领英超高效招聘海外员工、挖掘人才?

金三银四到了&#xff0c;每年的这个时候都是企业招聘的好时机。而领英是目前全球最大的职场社交网络平台&#xff0c;基本上海外求职都是在使用它&#xff0c;所以很多企业涉及到海外招聘时&#xff0c;都会优先考虑领英&#xff0c;但是却经常缺乏一些经验技巧&#xff0c;今…...

Mysql中锁机制深入理解

Mysql中锁机制深入理解默认大家已经知道。分类性能悲观锁&#xff0c;乐观锁操作类型读锁&#xff0c;写锁&#xff0c;数据粒度表锁&#xff0c;行锁&#xff0c;页面锁更细粒度间隙锁&#xff0c;临键锁按使用来讲。由数据粒度出发。表锁&#xff0c;分为 共享锁&#xff0c;…...

去中心化社交网络协议除了Nostr还有哪些?

当下最火的去中心化社交软件Dmaus就是基于Nostr协议开发的&#xff0c;Nostr协议的基本情况之前的文章《一文了解去中心化社交网络协议Nostr》已经做了详细介绍&#xff0c;本文将介绍其他几个目前比较流行的去中心化社交协议。FarcasterFarcaster是由前Coinbase高管Dan Romero…...

【FT2000/4+X100】调试记录

订阅专栏 硬件环境FT2000/4+X100,单板结构,对外显示,运行银行麒麟操作系统。 一 生成UEFI.BIN,烧写在FT2000-4的QSPI Flash中 1 2 下载源文件 edk2-for-support.tar; 参考文件 ft2004c&D2000编译打包说明V1.0.5; 解压源文件; 根目录下 build2004C.sh为四核产品…...

我的Android启动优化—【黑白屏优化】

简述 在Android App使用过程中&#xff0c;对于应用的优化是一个加分项&#xff0c;举个例子&#xff0c;打开你的App需要2秒&#xff0c;人家0.5秒&#xff0c;这就是很大的用户体验上的优化。 问题的产生 在开发中&#xff0c;我们在启动app的时候&#xff0c;屏幕会出现一…...

TongWeb8编码设置说明

应用场景&#xff1a;在遇到中文问题时&#xff0c;常需要通过设置编码格式来解决问题。下面介绍TongWeb8的编码设置及优先级。一、web.xml中请求、响应编码的配置优先级最高在JavaEE8规范中web.xml增加了request, response编码配置&#xff0c;该配置优先级最高。<?xml ve…...

不同相机之间图片像素对应关系求解(单应性矩阵求解)

一、场景 相机1和相机2相对位置不变&#xff0c;相机拍摄图片有重叠&#xff0c;求他们交叠部分的一一对应关系。数学语言描述为已知相机1图片中P点像素(u1, v1)&#xff0c;相机1中P点在相机2图片中像素值为(u2, v2)&#xff0c;它们存在某种变换&#xff0c;求变换矩阵。 因为…...

远程管理时代,还得是智能化PDU才靠得住!

在如今这个信息技术高速发展的时代&#xff0c;数据中心IDC机房服务器数量与日俱增&#xff0c;提供DNS域名服务、主机托管服务、虚拟主机服务等服务的服务器是IDC最基本的功能之一。服务器需要7*24小时不间断持续工作&#xff0c;但当服务器数量很大&#xff0c;服务器工作、重…...

通俗易懂理解——布隆过滤器

文章目录概述本质优缺点优点&#xff1a;缺点&#xff1a;实际应用解决redis缓存穿透问题&#xff1a;概述 本质 本质&#xff1a;很长的二进制向量&#xff08;数组&#xff09; 主要作用&#xff1a;判断一个数据在这个数组中是否存在&#xff0c;如果不存在为0&#xff0c…...

TypeScript 学习之类型推导

在一些情况下&#xff0c;代码上没有显性明确类型&#xff0c;typescript 可以隐形推断出类型。 基础 let x 3;变量x的类型被推断为数字。 类型推断发生在初始化变量和成员&#xff0c;设置默认参数值和决定函数返回值时 最佳通用类型 let x [0, 1, null]; // 类型为 numb…...

Android四大组件——Service详解

Service 为后台运行&#xff0c;不可见&#xff0c;没有界面。优先级高于Activity&#xff08;内存不足时先杀掉Activity&#xff09;&#xff0c;运行在主线程且不能做耗时操作。 一、Service 启动方式 1、startService() 通过 startService 启动后&#xff0c;service会一直…...

svg转png

svg转png写了一个spring boot项目&#xff0c;支持传入svg文件转出png图片&#xff0c;并且自定义转出png的宽和高。主要代码如下&#xff1a;所需依赖如下&#xff1a;演示如下&#xff1a;首先&#xff0c;运行项目使用接口调用工具调用接口发送请求&#xff0c;提取文件1000…...

教你如何搭建人事OA-员工管理系统,demo可分享

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建人事OA-员工管理。1.2、应用场景人事OA-员工管理应用对员工信息进行管理&#xff0c;可办理入职、转正、离职等流程。2、设置方法2.1、表单搭建1&#xff09;新建表单【员工管理】&#xff0c;字段设置如下&#xff1a;名称…...

C++递推基础知识

文章目录一、递推的概念二、递推和递归的区别三、递推的实例1、最基础的&#xff1a;斐波那契数列2、变形版斐波那契数列3、较复杂的递推式求解&#xff1a;昆虫繁殖4、经典逆推问题&#xff1a;题目数量一、递推的概念 1、什么是递推算法&#xff1f; 递推算法&#xff1a;是…...

网站制作公司网/营销渠道模式有哪些

2019独角兽企业重金招聘Python工程师标准>>> 1. 运行时配置&#xff08;php.ini&#xff09; output_buffering Off display_errors On 2. 函数说明 &#xff08;1&#xff09;bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase…...

备案上个人网站和企业网站的区别/学seo哪个培训好

OA实施方法论团队建设​项目经理的人选要求是具备一定软件技术的、更强调非技术方面的顾问咨询、项目管理的综合素质很强的人才。有效控制项目质量、项目进度、带领团队成功完成项目实施&#xff0c;是九思软件项目经理的职责&#xff0c;而不是合同签订下来&#xff0c;派个会…...

做网站的专业词汇/百度竞价培训班

提问&#xff1f;谁不会&#xff1f;这可能真是一件简单的事&#xff0c;但也未必。我正在看一本书《学会提问》。提问里有大学问。还有一本书&#xff0c;浏览了一遍&#xff0c;书名叫《你的灯亮着吗》。通过网络为人解惑已经有些日子了。近日一些事情让我深深感觉到不少同学…...

wordpress 更改icon/营销型网站建设推广

最根本的原因就是&#xff0c;走弯路是自然界的一种常态&#xff0c;走直路而是一种非常态。佛学院的一名禅师在上课时把一幅中国地图展开&#xff0c;问:“这幅图上的河流有什么特点?”“都不是直线&#xff0c;而是弯弯的曲线。”“为什么会是这样呢?也就是说&#xff0c;河…...

常州网站建设公司报价/今日军事新闻最新消息新闻报道

声明一个类&#xff0c;必须实现<RCTBridgeModule> 协议 .m文件中实现宏定义RCT_EXPORT_MODULE&#xff08;&#xff09;&#xff0c;当它加载的时候&#xff0c;会自动注册 // js_name 就是react native 获取类时所对应的名称&#xff0c; // 即 NativeModules.js_name…...

成都网站建制作/重庆seo代理计费

当需要查询的条目数太多&#xff0c;一页显示不全&#xff0c;需要分页提交sql请求 语法&#xff1a; SELECT 查询列表 FROM 表 LIMIT offset,size;offset代表的是起始的条目索引&#xff0c;也可以省略&#xff0c;默认从0开始 size代表的是显示的条目数 案例&#xff1a;查询…...