11-FastDFS

news2025/1/12 22:46:10

一 为什么要使用分布式文件系统

在这里插入图片描述

单机时代

初创时期由于时间紧迫,在各种资源有限的情况下,通常就直接在项目目录下建立静态文件夹,用于用户存放项目中的文件资源。如果按不同类型再细分,可以在项目目录下再建立不同的子目录来区分。例如: 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配合使用
  • 支持在线扩容
  • 支持主从文件

分布式文件服务提供商

  1. 阿里的OSS
  2. 七牛云存储
  3. 百度云储存

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 fdfs

tcp        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 fdfs

tcp        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.conf

connect_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]

参数含义:

  1. 配置文件路径
  2. 本地文件路径
  3. [storage_ip:port] :(可选参数)
  4. [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>]

参数含义:

  1. 配置文件路径
  2. 文件在FastDFS中的唯一文件标识,即卷名+文件名
  3. [local_filename] :文件下载地址
  4. <download_offset>:(可选参数)文件下载开始时间
  5. <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>

参数含义:

  1. 配置文件路径
  2. 文件在FastDFS中的唯一文件标识,即卷名+文件名

指令使用

[root@tracker fdfs]# fdfs_file_info /etc/fdfs/client.conf
group1/M00/00/00/wKhygVwnUUOAcgYHCCZp2Ahsb3g964.rpm

删除指令

指令参数

fdfs_delete_file <config_file> <file_id>

参数含义:

  1. 配置文件路径
  2. 文件在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: 1501
  connect-timeout: 601
  thumb-image: # 缩略图生成参数
    width: 150
    height: 150
  tracker-list: #TrackerList参数,支持多个
    - 192.168.66.100:22122

上传文件操作与文件下载的操作

@SpringBootTest
class FdfsdemoApplicationTests {

    @Autowired
    private FastFileStorageClient fastFileStorageClient;

    //测试springboot环境下的javaAPI对分布式文件系统的上传文件的操作
    @Test
    public 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对分布式文件系统的下载文件的操作
    @Test
    public 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存储节点的客户端对象
    @Autowired
    private 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个原因

  1. 为分布式文件系统提供Http服务支持

通过Nginx的web服务代理访问分布式文件系统的存储节点,从而实现通过http请求访问存储节点资源。

在这里插入图片描述

注意: src 属性值图像文件的 URL。也就是引用该图像的文件的的绝对 路径或相对路径。

  1. 解决复制延迟问题

由于FastDFS的同卷的存储节点之间需要同步,当文件尚未同步完 成时,访问请求到达改节点,获取的数据将是未同步完的不完整数据,即为复制延迟问题。通过Nginx检测请求的存储节点的数据, 若该存储节点的数据尚未同步完成,则将请求转发至数据的原存储节点,从而解决复制延迟问题。

在这里插入图片描述

环境搭建

下载Fastdfs的Nginx模块包(直接通过xftp上传)

解压到/usr/local下

V1.22.tar.gz

tar -zxvf V1.22.tar.gz -C /usr/local

下载Nginx软件包(直接通过xftp上传)

解压到/usr/local下

nginx-1.19.2.tar.gz

tar -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.conf

server {
    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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/423703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Verilog | 轮询仲裁

仲裁 当多个源和用户需要共享同一资源时&#xff0c;需要某种仲裁形式&#xff0c;使得所有用户基于一定的规则或算法得到获取或访问共享资源的机会。 仲裁方案 严格优先级轮询 根据优先级的差异&#xff0c;用户访问共享资源的机会也不同。低优先级的用户可能时钟无法得到资…

数据智能服务商奇点云完成近亿元C2轮融资

奇点云集团宣布已于2022年底完成近亿元C2轮融资&#xff0c;余杭国投领投&#xff0c;中银渤海基金跟投。 截至目前&#xff0c;奇点云共获近3亿元C轮融资。C轮领投方包括泰康人寿&#xff08;旗下泰康资产执行&#xff09;、余杭国投&#xff0c;跟投方包括字节跳动、德同资本…

九龙证券|巴菲特又出手了!嗅到了什么?日本央行新行长发声

巴菲特或再发日元债&#xff0c;嗅到了什么&#xff1f; 有商场消息称&#xff0c;知情人士泄漏&#xff0c;沃伦巴菲特旗下伯克希尔哈撒韦已开端就出售日元债券向投资者征求意见。这似乎印证了稍早之前的信息&#xff0c;此前&#xff0c;据彭博报导&#xff0c;伯克希尔哈撒韦…

实验手册 - 第5周Pair RDD与分区

目录标题实验1实验2实验3实验4实验5import findspark findspark.init() from pyspark import SparkContextsc SparkContext()实验1 实验1&#xff1a;已知内存数据源 list01 [1, 2, 3, 4, 11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44, 51, 52, 53, 54] …

redis数据结构底层原理及相关运用

Redis的数据结构 Redis的数据结构&#xff0c;可以在两个不同的层面来讨论它。 第一个层面&#xff0c;是从使用者的角度。比如&#xff1a;string、list、hash、set、zset(sorted set)五种数据类型 这一层面也是Redis暴露给外部的调用接口&#xff0c;也就是我们平时使用re…

多态-虚函数表

VS的对象内存分析: /d reportSingleClassLayout类名 使用方法:项目 -- 属性 -- C/C -- 命令行--其他选型(D) 添加命令.如图所示: Father类: class Father { public:virtual void Func1() { cout << "Father::Func1" << endl; }virtual void Func2() { c…

【Redis】亿级数据的收集+清洗+统计+展现

文章目录聚合统计(set->共同好友)排序统计(zset->评论排序)二值统计(bitmap->签到打卡)基数统计(hyperloglog->亿级UV统计方案)地理坐标(GEO)布隆过滤器面试题定义产生背景作用底层原理聚合统计(set->共同好友) 统计多个集合元素的聚合结果&#xff0c;就是前面…

DF竞赛平台助力首届“深水云脑杯”全国智慧水务数据创新大赛圆满落幕

首届“深水云脑杯”全国智慧水务数据创新大赛决赛现场 首届“深水云脑杯”全国智慧水务数据创新大赛已圆满落幕&#xff0c;DataFountain大数据竞赛平台&#xff08;简称DF平台&#xff09;作为官方竞赛平台为本次大赛提供办赛支持。该赛事以数字化创新模式为抓手&#xff0c;…

从零学习SDK(6)调试和测试SDK的库

在前面的文章中&#xff0c;我们介绍了什么是SDK&#xff0c;以及如何选择和接入合适的SDK。在本文中&#xff0c;我们将重点讲解如何调试和测试SDK的库&#xff0c;以确保我们的应用能够正常运行&#xff0c;没有错误或异常。 SDK的库是什么呢&#xff1f;简单来说&#xff0…

DAF Trucks EDI项目案例

DAF Trucks是一家荷兰卡车制造商&#xff0c;通过EDI系统与其供应商和客户之间进行电子交换。DAF Trucks EDI系统包括订单处理、发货通知、发票和付款等功能&#xff0c;能够快速、准确地交换业务文档&#xff0c;提高供应链管理水平。DAF计划将其EDI系统扩展到更多的供应商和客…

JavaScript学习笔记(二)

文章目录第4章&#xff1a;变量、作用域与内存1. 原始值与引用值2. 执行上下文与作用域3. 垃圾回收第5章&#xff1a;基本引用类型1. Date&#xff1a;参考了Java早期版本中的java.util.Date2. RegExp3. 原始值包装类型第6章&#xff1a;集合引用类型1. Object2. Array&#xf…

三电技术之电池管理技术

三电技术之电池管理技术 1 功能概述 电池管理系统 (Battery Management System), 即管理电池的充放电&#xff0c;使电池处于一个最佳的状态。 电池是由多个电芯组成的&#xff0c;每个电芯充放电都是一个电化学反应的过程。无论电芯的制造多精密&#xff0c;随着使用时间、…

OpenText 企业内容管理平台介绍

OpenText 企业内容管理平台介绍 将 ECM 扩展到领先的业务应用程序中&#xff0c;为内容添加上下文&#xff0c;从而提高效率和决策能力 突出优点&#xff1a; 1、企业拥有更多数据、更多来源、更多用途并按需提供 2、员工需要一种新的交互、共享和消费内容的方式 3、更多内容需…

系统分析师冲刺班练习题

系统配置与性能评价---性能指标 吞吐量是指网络、设备、端口、虚拟电路或其他设备&#xff0c;单位时间内成功地传送数据的数量&#xff08;以比特、字节、分组等测量&#xff09; 系统配置与性能评价---性能评价方法 指令执行速度法&#xff1a;在计算机发展的初期&#xff…

【C++】2.C++的输入与输出

文章目录前言一、C的输入\出头文件二、C的输入&输出关键字2.1 输出cout2.2 输入cin三、c输入输出与c语言的输入输出前言 c语言中我们使用scanf,printf等来进行输入、输出操作&#xff0c;在C中我们是否有其他方式呢&#xff1f;答案是有的&#xff0c;下面我们来介绍c的输…

JavaSE学习进阶day05_01 Collection集合概述

第九章 Collection集合 9.1 集合概述 在前面基础班我们已经学习过并使用过集合ArrayList<E> ,那么集合到底是什么呢? 集合&#xff1a;集合是java中提供的一种容器&#xff0c;可以用来存储多个数据。 集合和数组既然都是容器&#xff0c;它们有什么区别呢&#xff1…

快排(动图详细版,快速理解)

注&#xff1a;本文主要介绍六大排序中的快排 文章目录前言一、三大法则1.1 Hoare法1.2 挖坑法1.3 双指针法&#xff08;更加便捷&#xff09;1.4 三种方法时间复杂度计算二、快排栈问题优化方式2.1 三数取中2.2 小区间优化三、非递归快排前言 快速排序是Hoare于1962年提出的一…

生活污水处理设备选购指南

生活污水中含有大量的有机物&#xff08;如蛋白质、碳水化合物、脂肪、尿素、氨氮等&#xff09;及大量的病原微生物&#xff0c;可导致传染病蔓延流行。因此&#xff0c;生活污水在排放前&#xff0c;需要进行处理。那么如何正确的选择生活污水处理设备呢&#xff1f; 一、生活…

移动机器人设计与实践-基础概念汇总

如下全文在关键词提示词等脚本交互下&#xff0c;由文图版本生成式人工智能在1分钟内创作完成。 AI自动生成文章评分已经远超大部分博文评分值。 人类社会经历过农业时代&#xff08;最强代表汉唐&#xff09;-工业时代&#xff08;最强代表日不落帝国&#xff09;-信息时代&a…

利用MyBatis实现CRUD操作

文章目录一、添加按姓名查询用户记录功能1、添加按姓名查询的映射语句2、在用户映射器接口里添加按姓名查询用户记录的方法3、添加按姓名查询用户记录的测试方法4、测试按姓名查询用户记录二、插入表记录1、在UserMapper.xml里增加映射语句 - insert2、在UserMapper接口里增加i…