11-FastDFS
一 为什么要使用分布式文件系统
单机时代
初创时期由于时间紧迫,在各种资源有限的情况下,通常就直接在项目目录下建立静态文件夹,用于用户存放项目中的文件资源。如果按不同类型再细分,可以在项目目录下再建立不同的子目录来区分。例如: resources\static\file 、 resources\static\img 等。
注意:
优点:便利,使用方便。
缺点:文件越多存放越混乱。
独立文件服务器
随着公司业务不断发展,将代码和文件放在同一服务器的弊端就会 越来越明显。为了解决上面的问题引入独立图片服务器
流程: 项目上传文件时,首先通过ftp或者ssh将文件上传到图片服务器的某个目录下,再通过Ngnix或者Apache来访问此目录下的文件,返回一个独立域名的图片URL地址,前端使用文件时就通过这个URL地址读取。
分布式文件系统
业务继续发展,单台服务器存储和响应也很快到达了瓶颈,新的业务需要文件访问具有高响应性、高可用性来支持系统。
优点:
- 扩展能力: 毫无疑问,扩展能力是一个分布式文件系统最重要的特点;
- 高可用性: 在分布式文件系统中,高可用性包含两层,一是整个文件系统的可用性,二是数据的完整和一致性;
- 弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行。
缺点:
- 系统复杂度稍高,需要更多服务器
二 FastDFS概述
1 简介
FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务,如相册网站、视频网站等等。
FastDFS特性:
- 文件不分块存储,上传的文件和OS文件系统中的文件一一对应
- 支持相同内容的文件只保存一份,节约磁盘空间
- 下载文件支持HTTP协议,可以使用内置Web Server,也可以和其他Web Server配合使用
- 支持在线扩容
- 支持主从文件
分布式文件服务提供商
- 阿里的OSS
- 七牛云存储
- 百度云储存
2 核心概念
FastDFS服务端有三个角色:跟踪服务器(tracker)、存储服务器 (storage)和客户端(client)。
tracker
跟踪服务器,主要做调度工作,起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。
storage
存储服务器(又称:存储节点或数据服务器),文件和文件属性 (meta data)都保存到存储服务器上。Storage server直接利用 OS的文件系统调用管理文件。
client
客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete 等,以客户端库的方式提供给用户使用。
group
组, 也可称为卷。 同组内服务器上的文件是完全相同的 ,同一组内的storage server之间是对等的, 文件上传、 删除等操作可以在任意一台storage server上进行 。
流程:
Tracker相当于FastDFS的大脑,不论是上传还是下载都是通过 tracker来分配资源;客户端一般可以使用Ngnix等静态服务器来调用或者做一部分的缓存;存储服务器内部分为卷(或者叫做组),卷于卷之间是平行的关系,可以根据资源的使用情况随时增加,卷内服务器文件相互同步备份,以达到容灾的目的。
3 上传机制
首先客户端请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求上传文件,存储服务器接收到请求后上传文件,并且将文件内容写入磁盘并返回给客户端 file_id、路径信息、文件名等信息,客户端保存相关信息上传完毕。
内部机制如下
1、选择Tracker server
当集群中不止一个Tracker server时,由于Tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer。
2、选择Storage server
当选定Group后,Tracker会在Group内选择一个Storage Server给 客户端
3、选择Storage path
当分配好Storage Server后,客户端将向Storage发送写文件请求, Storage将会为文件分配一个数据存储目录。
注意: 剩余存储空间最多的优先。
4、生成Fileid
选定存储目录之后,Storage会为文件生一个Fileid,由Storage Server Ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。
5、生成文件名
当文件存储到某个子目录后,即认为该文件存储成功,接下来会为 该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型) 拼接而成。
4 下载机制
客户端带上文件名信息请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求下载文件,存储服务器接收到请求后返回文件给客户端。
内部机制如下
- client询问tracker下载文件的storage,参数为文件标识(组名和文件名)
- tracker返回一台可用的storage
- client直接和storage通讯完成文件下载
三 FastDFS环境搭建_Linux
下载安装gcc
yum install gcc-c++ perl-devel pcre-devel openssl-devel zlib-devel wget
下载FastDFS(直接通过xftp上传)
V6.06.tar.gz
下载FastDFS依赖(直接通过xftp上传)
V1.0.43.tar.gz
解压缩依赖tar包
tar -zxvf V1.0.43.tar.gz -C /usr/local
tar -zxvf V6.06.tar.gz -C /usr/local
编译并安装libfastcommon
cd /usr/local/libfastcommon-1.0.43/./make.sh && ./make.sh install
编译并安装FastDFS
cd /usr/local/fastdfs-6.06
./make.sh && ./make.sh install
进入etc目录下复制配置文件
cd /etc/fdfs/
cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf
创建tracker服务
创建tracker目录
mkdir -p /data/fastdfs/tracker
修改配置文件
vim /etc/fdfs/tracker.conf#启用配置文件
disabled=false
#设置 tracker的端口号
port=22122
#设置 tracker的数据文件和日志目录(需预先创建)
base_path=/data/fastdfs/tracker
#设置 http 端口号
#指的是在tracker服务器上启动http服务进程,如:apache或者nginx 启动时所监听的端口
http.server_port=8888
启动tracker服务
/etc/init.d/fdfs_trackerd start
检查tracker服务
netstat -lntup |grep fdfstcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 1476/fdfs_trackerd
创建storage服务
创建storage目录
mkdir -p /data/fastdfs/base
mkdir -p /data/fastdfs/storage
修改配置文件
vim /etc/fdfs/storage.conf#启用配置文件
disabled=false
#组名,根据实际情况修改
group_name=group1
#设置storage 的端口号
port=23000
#设置storage 的日志目录(需预先创建)
base_path=/data/fastdfs/base
#存储路径个数,需要和 store_path 个数匹配
store_path_count=1
#存储路径
store_path0=/data/fastdfs/storage
#tracker 服务器的 IP 地址和端口号
tracker_server=192.168.66.100:22122
#设置storage上启动的http服务的端口号,如安装的nginx的端口号
http.server_port=8888
启动storage服务
/etc/init.d/fdfs_storaged start
查看storage服务
netstat -lntup |grep fdfstcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 1476/fdfs_trackerd
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 1466/fdfs_storaged
修改Client配置文件
vim /etc/fdfs/client.confconnect_timeout=30
network_timeout=60
# 日志路径
base_path=/data/fastdfs/client
# 追踪服务器的IP,有多个服务器可以另一行
tracker_server=192.168.66.100:22122
创建日志目录
mkdir -p /data/fastdfs/client
查看启动的服务
ps -ef | grep fdfs
四 FastDFS指令
上传指令
指令参数
fdfs_upload_file <config_file> <local_filename> [storage_ip:port] [store_path_index]
参数含义:
- 配置文件路径
- 本地文件路径
- [storage_ip:port] :(可选参数)
- [store_path_index] :(可选参数)
指令使用
[root@tracker fdfs]# fdfs_upload_file /etc/fdfs/client.conf 上传的文件路径
注意: 上传文件后会返回文件在FastDFS中的唯一文件标识,即卷名 +文件名
下载指令
指令参数
fdfs_download_file <config_file> <file_id> [local_filename] [<download_offset>
<download_bytes>]
参数含义:
- 配置文件路径
- 文件在FastDFS中的唯一文件标识,即卷名+文件名
- [local_filename] :文件下载地址
- <download_offset>:(可选参数)文件下载开始时间
- <download_bytes>:(可选参数)文件下载的字节数
指令使用
[root@tracker fdfs]# fdfs_download_file /etc/fdfs/client.conf
group1/M00/00/00/wKhygVwnUUOAcgYHCCZp2Ahsb3g964.rpm
查看文件信息指令
指令参数
fdfs_file_info <config_file> <file_id>
参数含义:
- 配置文件路径
- 文件在FastDFS中的唯一文件标识,即卷名+文件名
指令使用
[root@tracker fdfs]# fdfs_file_info /etc/fdfs/client.conf
group1/M00/00/00/wKhygVwnUUOAcgYHCCZp2Ahsb3g964.rpm
删除指令
指令参数
fdfs_delete_file <config_file> <file_id>
参数含义:
- 配置文件路径
- 文件在FastDFS中的唯一文件标识,即卷名+文件名
指令使用
[root@tracker fdfs]# fdfs_delete_file /etc/fdfs/client.conf
group1/M00/00/00/wKhygVwnUUOAcgYHCCZp2Ahsb3g964.rpm
注意:删除指令使用后,文件在该卷中的所有备份都会被删除,因为卷内的存储节点会相互同步,故慎用。
五 SpringBoot操作FastDFS
由GitHub大牛tobato在原作者YuQing与yuqih发布的JAVA客户端基础上进行了大量重构工作,并于GitHub上发布了FastDFSClient1.26.5。
主要特性
- 对关键部分代码加入了单元测试,便于理解与服务端的接口交易,提高接口质量
- 将以前对byte硬解析风格重构为使用对象+注解的形式,尽量增强了代码的可读性
- 支持对服务端的连接池管理
- 支持上传图片时候检查图片格式,并且自动生成缩略图
- 在SpringBoot当中自动导入依赖
实战开发
导入FastDFS依赖jar
<dependency><groupId>com.github.tobato</groupId><artifactId>fastdfs-client</artifactId><version>1.26.5</version></dependency>
配置SpringBoot的入口类
package com.lxx.fdfsdemo;import com.github.tobato.fastdfs.FdfsClientConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableMBeanExport;
import org.springframework.context.annotation.Import;
import org.springframework.jmx.support.RegistrationPolicy;//获取带有连接池的FastDFS Java客户端
@Import(FdfsClientConfig.class)
// 解决jmx重复注册bean的问题
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)@SpringBootApplication
public class FdfsdemoApplication {public static void main(String[] args) {SpringApplication.run(FdfsdemoApplication.class, args);}}
配置springboot的application.yml配置文件
# 分布式文件系统FDFS配置
fdfs:so-timeout: 1501connect-timeout: 601thumb-image: # 缩略图生成参数width: 150height: 150tracker-list: #TrackerList参数,支持多个- 192.168.66.100:22122
上传文件操作与文件下载的操作
@SpringBootTest
class FdfsdemoApplicationTests {@Autowiredprivate FastFileStorageClient fastFileStorageClient;//测试springboot环境下的javaAPI对分布式文件系统的上传文件的操作@Testpublic void testUpload() throws FileNotFoundException {//获取本地文件File file = new File("G:\\666.png");//创建传输文件的输入流FileInputStream fileInputStream = new FileInputStream(file);//文件上传:// 参数一:传输文件内容的输入流;// 参数二:文件的size;// 参数三:文件扩展名;// 参数四:描述文件的元数据;// 返回值:上传文件在存储节点的唯一标识(卷名+文件名)//StorePath storePath = fastFileStorageClient.uploadFile(fileInputStream, file.length(), "png", null);//将卷名与文件名一起打印System.out.println(storePath.getFullPath());//将卷名与文件名分别打印System.out.println(storePath.getGroup() + " | " + storePath.getPath());}//测试springboot环境下的javaAPI对分布式文件系统的下载文件的操作@Testpublic void testDownload() throws IOException {//下载文件:// 参数一:文件处于存储节点的卷名;// 参数二:文件在存储节点的文件名;// 参数三:下载的回调函数;// 返回值:文件内容的字节数组byte[] bytes = fastFileStorageClient.downloadFile("group1", "M00/00/00/wKhCZGQPkj6AAIAHAAAUlrX9mjc722.png", new DownloadByteArray());//创建文件输出流,指定输出位置及文件名FileOutputStream fileOutputStream = new FileOutputStream("G:\\mei.jpg");//使用文件输出流将文件内容字节数组写出fileOutputStream.write(bytes);//刷新输出流fileOutputStream.flush();//关闭输出流fileOutputStream.close();}}
六 文件上传_SpringBoot基于FastDFS实现
@RestController
public class UploadToFastDFSController {//fastdfs存储节点的客户端对象@Autowiredprivate FastFileStorageClient fastFileStorageClient;@PostMapping("/fileUpload")public void uploadMoreImage(MultipartFile[] files) {String path = "";//判断是否上传图片if (files != null && files.length != 0) {//遍历上传图片for (MultipartFile multipartFile : files) {//获取上传文件名String filename = multipartFile.getOriginalFilename();//获取最后一个“.”的下标,并获取从这个下标的下一个下标开始后的字符作为文件后缀String fileSuffix = filename.substring(filename.lastIndexOf(".") + 1);StorePath storePath = null;try {//上传文件storePath = fastFileStorageClient.uploadFile(multipartFile.getInputStream(),multipartFile.getSize(),fileSuffix,null);} catch (IOException e) {e.printStackTrace();}//打印返回的文件在存储节点的唯一标识System.out.println(storePath.getFullPath());}}}
}
<form action="fileUpload" method="post" enctype="multipart/form-data"><input type="file" name="files"/> <br/><input type="file" name="files"/> <br/><input type="submit" value="Upload"/>
</form>
七 FastDFS集成Nginx
Nginx服务器是一个高性能的web服务器与反向代理服务器
FastDFS集成Nginx的2个原因
- 为分布式文件系统提供Http服务支持
通过Nginx的web服务代理访问分布式文件系统的存储节点,从而实现通过http请求访问存储节点资源。
注意: src 属性值图像文件的 URL。也就是引用该图像的文件的的绝对 路径或相对路径。
- 解决复制延迟问题
由于FastDFS的同卷的存储节点之间需要同步,当文件尚未同步完 成时,访问请求到达改节点,获取的数据将是未同步完的不完整数据,即为复制延迟问题。通过Nginx检测请求的存储节点的数据, 若该存储节点的数据尚未同步完成,则将请求转发至数据的原存储节点,从而解决复制延迟问题。
环境搭建
下载Fastdfs的Nginx模块包(直接通过xftp上传)
解压到/usr/local下
V1.22.tar.gztar -zxvf V1.22.tar.gz -C /usr/local
下载Nginx软件包(直接通过xftp上传)
解压到/usr/local下
nginx-1.19.2.tar.gztar -zxvf nginx-1.19.2.tar.gz -C /usr/local
安装Nginx依赖文件
yum install -y gcc gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel gddevel epel-release
配置Nginx服务器
cd /usr/local/nginx-1.19.2#建立Makefile文件,检查Linux系统环境以及相关的关键属性。
./configure --add-module=/usr/local/fastdfs-nginx-module-1.22/src#编译项目,主要将gcc源代码编译成可执行的目标文件
make#根据上一步骤编译完成的数据安装到预定的目录中。
make install
注意:
–add-module:为nginx添加一个fastdfs-nginx-module模块,值为该模块在当前系统的路径
–prefix:指定nginx安装位置
将Fastdfs软件包里面的http.conf和mime.types拷贝到/etc/fdfs 目录下
cp /usr/local/fastdfs-6.06/conf/mime.types /etc/fdfs/
cp /usr/local/fastdfs-6.06/conf/http.conf /etc/fdfs/
配置Nginx的fastdfs模块,并编辑文件
#拷贝文件
cp /usr/local/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/vim mod_fastdfs.conf#保存日志目录
base_path=/data/fastdfs/storage
#tracker 服务器的 IP 地址以及端口号
tracker_server=192.168.66.100:22122
#文件url中是否有group名
url_have_group_name = true
#存储路径
store_path0=/data/fastdfs/storage
#设置组的个数
group_count = 1
#然后在末尾添加分组信息,目前只有一个分组,就只写一个
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs/storage
配置Nginx
vim /usr/local/nginx/conf/nginx.confserver {listen 80;server_name localhost;location ~ /group[1-3]/M00 {alias /data/fastdfs/storage/data;ngx_fastdfs_module;}}
启动Ningx服务
# 进入sbin目录
[root@tracker nginx]# cd sbin/
# 启动服务 -c:指定配置文件
[root@tracker sbin]# ./nginx -c /usr/local/nginx/conf/nginx.conf
查看服务启动情况
[root@tracker sbin]# ps -ef | grep nginx
启动追踪服务与存储节点服务
[root@tracker sbin]# fdfs_trackerd /etc/fdfs/tracker.conf start
[root@tracker sbin]# fdfs_storaged /etc/fdfs/storage.conf start
上传图片测试
将图片上传至linux系统后,使用指令上传至分布式文件系统
[root@localhost opt]# fdfs_upload_file /etc/fdfs/client.conf /opt/666.jpg
group1/M00/00/00/wKhCZGQPp9uADn32ABU3jnny8Mc041.jpg
通过浏览器远程访问
http://192.168.66.100/group1/M00/00/00/wKhCZGQPp9uADn32ABU3jnny8Mc041.jpg
相关文章:

11-FastDFS
一 为什么要使用分布式文件系统 单机时代 初创时期由于时间紧迫,在各种资源有限的情况下,通常就直接在项目目录下建立静态文件夹,用于用户存放项目中的文件资源。如果按不同类型再细分,可以在项目目录下再建立不同的子目录来区分…...

Word这样用,提高效率不加班
Word这样用,提高效率不加班 今天给大家分享23条Word文档的应用小技巧。对于大家来说,掌握些技巧能够效率百倍,何乐不为? 这些技巧是本人通过整理一直在用并且使用频率较高的,也希望能帮到大家。有兴趣的小伙伴可以自己…...

【Linux】调试器---gdb的使用
文章目录 一.背景知识二.安装gdb三.gdb的用法使用须知gdb的常用指令1.进入调试2.退出调试操作3.显示源代码4.设置断点breakPoint5.查看断点信息/禁用断点/开启断点/删除断点6.运行程序,开始调试run7.查看变量8.其它重要命令 一.背景知识 程序的发布方式有两种&…...

MySQL数据库之表的增删改查(进阶)
目录 1. 数据库约束1.1 约束类型1.2 NULL约束1.3 UNIQUE:唯一约束1.4 DEFAULT:默认值约束1.5 PRIMARY KEY:主键约束1.6 FOREIGN KEY:外键约束1.7 CHECK约束 2 表之间的关系2.1 一对一2.2 一对多2.3 多对多 3 新增4 查询4.1 聚合查…...

Nginx从开始到结束,简单到小白都能懂哦
绪论 大家好,很高兴能够为大家带来这篇关于Nginx配置的新手指南。在这篇博客中,我们将通过简单明了的图文教程,帮助大家快速上手Nginx配置,解锁Nginx的各种神奇功能! 一、Nginx简介 Nginx是一款功能强大的web服务器…...

Qt——Qt控件之按钮-QDialogButtonBox对话框按钮盒子控件的使用总结(例程:自定义按钮)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》...

数据库学习-常用的SQL语句
背景: 汇整一下自己学习数据库过程中常见的题目及语句。 一.实例分析题 二.简单SQL查询: 1):统计每个部门员工的数目select dept,count(*) from employee group by dept;2):统计每个部门员工的数目大于一个的记录se…...

5种获取JavaScript时间戳函数的方法
5种获取JavaScript时间戳函数的方法 一、JavasCRIPT时间转时间戳方法一:Date.now()方法二:Date.parse()方法三:valueOf()方法四:getTime()方法五:Number 二、js时间戳转时间方法一:生成2022/1/18 上午10:09…...

图的宽度优先遍历
文章目录 图的宽度优先遍历程序设计程序分析图的宽度优先遍历 【问题描述】根据输入图的邻接矩阵A,给出图的宽度优先遍历序列; 【输入形式】第一行为图的结点个数n,第二行输入顶点的信息,每个顶点用一个字符表示,接下来的n行为图的邻接矩阵A。其中A[i][j]=1表示两个结点邻…...

企业AD域(域控服务器)的安装和配置详细教程
一、环境以及工具准备 软件:VMWare Workstation 2016 ( 下载链接:https://pan.baidu.com/s/1iX1VRilerYPGbGvX4pvaKw 提取码:75R6 ) 镜像:Windows Server 2016 ( 下载地址ÿ…...

面试官:一千万的数据,你是怎么查询的?
面试官:一千万的数据,你是怎么查询的? 1 先给结论 对于1千万的数据查询,主要关注分页查询过程中的性能 针对偏移量大导致查询速度慢: 先对查询的字段创建唯一索引 根据业务需求,先定位查询范围(…...

IntelliJ 上 Azure Event Hubs 全新支持来了!
大家好,欢迎来到 Java on Azure Tooling 的3月更新。在这次更新中,我们将介绍 Azure Event Hubs 支持、Azure Functions 的模板增强,以及在 IntelliJ IDEA 中部署 Azure Spring Apps 时的日志流改进。要使用这些新功能,请下载并安…...

性能测试,监控磁盘读写iostat
性能测试,监控磁盘读写iostat iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出 CPU使用情况。同vmstat一样,ios…...

steam游戏搬砖项目怎么做?月入过万的steam搬砖项目教程拆解
steam游戏搬砖项目怎么做?月入过万的steam搬砖项目教程拆解 大家好,我是童话姐姐,今天继续来聊Steam搬砖项目。 Steam搬砖项目也叫CSGO搬砖项目,它并不是什么刚面世的新项目,是已经存在至少七八年的一个资深老牌项目。这个项目…...

协同运力、算力、存力,加速迈向智能世界
2023年4月20日,华为在HAS2023期间举办“迈向智能世界”主题论坛,吸引了来自全球的分析师、专家学者及媒体与会。会上,华为ICT战略与Marketing总裁彭松发表了“持续技术创新,加速迈向智能世界”的主题演讲。 华为ICT战略与Marketin…...

被裁员了,要求公司足额补缴全部公积金,一次补了二十多万!网友兴奋了,该怎么操作?...
被裁员后,能要求公司补缴公积金吗? 一位网友问: 被裁员了,要求公司把历史公积金全部足额缴纳,现在月薪2.3万,但公司每个月只给自己缴纳300元公积金,结果一次补了二十多万,一次性取出…...

家庭智能插座一Homekit智能
传统的灯泡是通过手动打开和关闭开关来工作。有时,它们可以通过声控、触控、红外等方式进行控制,或者带有调光开关,让用户调暗或调亮灯光。 智能灯泡内置有芯片和通信模块,可与手机、家庭智能助手、或其他智能硬件进行通信&#x…...

什么是雪花算法?啥原理?
1、SnowFlake核心思想 SnowFlake 算法,是 Twitter 开源的分布式 ID 生成算法。 其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛,且 ID 引入了时间戳,基本上保持自增的…...

【华为OD机试真题】 统计差异值大于相似值二元组个数(javapython)
统计差异值大于相似值二元组个数 知识点数组进制转换Q整数范围循环 时间限制:1s空间限制:256MB限定语言:不限 题目描述: 题目描述:对于任意两个正整数A和B,定义它们之间的差异值和相似值: 差异值:A、B转换成二进制后,对于二进制的每一位,对应位置的bit值不相同则为…...

【cmake篇】选择编译器及设置编译参数
实际开发的过程中,可能有多个版本的编译器,不同功能可能需要设置不同的编译参数。 参考文章链接:选择编译器及设置编译器选项 目录 一、选择编译器 1、查看系统中已有的编译器 2、选择编译器的两种方式 二、设置编译参数 1、add_compil…...

MySQL having关键字详解、与where的区别
1、having关键字概览 1.1、作用 对查询的数据进行筛选 1.2、having关键字产生的原因 使用where对查询的数据进行筛选时,where子句中无法使用聚合函数,所以引出having关键字 1.3、having使用语法 having单独使用(不与group by一起使用&a…...

CSS中相对定位与绝对定位的区别及作用
CSS中相对定位与绝对定位的区别及作用 场景复现核心干货相对定位绝对定位子绝父相🔥🔥定位总结绝对定位与相对定位的区别 场景复现 在学习前端开发的过程中,熟练掌握页面布局和定位是非常重要的,因此近期计划出一个专栏ÿ…...

7.1 基本运放电路(1)
集成运放的应用首先表现在它能构成各种运算电路上,并因此而得名。在运算电路中,以输入电压作为自变量,以输出电压作为函数;当输入电压变化时,输出电压将按一定的数学规律变化,即输出电压反映输入电压某种运…...

交友项目【首页推荐,今日佳人,佳人信息】
目录 1:首页推荐 1.1:接口地址 1.2:流程分析 1.3:代码实现 2:今日佳人 1.1:接口地址 1.2:流程分析 1.3:代码实现 3:佳人信息 1.1:接口地址 1.2&am…...

kafka-5 kafka的高吞吐量和高可用性
kafka的高吞吐量和高可用性 6.1 高吞吐量6.2 高可用(HA) 6.1 高吞吐量 kafka的高吞吐量主要是由4方面保证的: (1)顺序读写磁盘 Kafka是将消息持久化到本地磁盘中的,一般人会认为磁盘读写性能差ÿ…...

Jmeter前置处理器和后置处理器
1. 后置处理器(Post Processor) 本质上是⼀种对sampler发出请求后接受到的响应数据进⾏处理 (后处理)的⽅法 正则表达式后置处理器 (1)引⽤名称:下⼀个请求要引⽤的参数名称,如填写title,则可…...

手把手带你了解《线程池》
文章目录 线程池的概念池的目的线程池的优势为什么从池子里拿线程更高效?构造方法参数讲解线程拒绝策略模拟实现线程池一个线程池设置多少线程合适? 线程池的概念 线程池:提前把线程准备好,创建线程不是直接从系统申请࿰…...

idea中使用git工具
目录 一、IDEA中配置git二、git操作将项目设置成git仓库 一、IDEA中配置git 打开idea,点击File–>Settings 点击版本控制,然后点击git 将你的git.exe安装目录填到下面位置 点击test可以看到显示了版本,说明配置成功 二、git操作 将项目设…...

剖析DLL(动态链接库)的使用方法
为了更好地理解和应用dll,我们首先需要了解dll的概念和原理。 一、dll(Dynamic Link Library)的概念 dll是一种动态链接库,它是在Windows操作系统中广泛使用的一种机制,它允许程序在运行时调用动态链接库中的函数。d…...

第二章 设计模式七大原则
文章目录 前言一、单一职责 🍧1、单一职责原则注意事项和细节2、代码实现2、1 错误示例2、2 正确示例但有缺陷2、3 最终形态 二、接口隔离原则 🥩1、代码示例 三、依赖倒转原则 🥥1、代码示例2、依赖关系传递的三种方式 四、里氏替换原则 &am…...