分布式文件存储与数据缓存 FastDFS

一、FastDFS概述

1.1 什么是分布式文件系统

单机时代

初创时期由于时间紧迫,在各种资源有限的情况下,通常就直接在项目目录下建立静态文件夹,用于用户存放项目中的文件资源。如果按不同类型再细分,可以在项目目录下再建立不同的子目录来区分。例如:resources\static\fileresources\static\img等。

优点:便利,使用方便。

缺点:文件越多存放越混乱

独立文件服务器

随着公司业务不断发展,将代码和文件放在同一服务器的弊端就会越来越明显。为了解决上面的问题引入独立图片服务器,

流程:

项目上传文件时,首先通过ftp或者ssh将文件上传到图片服务器的某个目录下,再通过Ngnix或者Apache来访问此目录下的文件,返回一个独立域名的图片URL地址,前端使用文件时就通过这个URL地址读取。

缺点:

存在单点故障的问题。数据备份需要人为干预。

分布式文件系统

业务继续发展,单台服务器存储和响应也很快到达了瓶颈,新的业务需要文件访问具有高响应性、高可用性来支持系统。

优点

  • 扩展能力: 毫无疑问,扩展能力是一个分布式文件系统最重要的特点;
  • 高可用性: 在分布式文件系统中,高可用性包含两层,一是整个文件系统的可用性,二是数据的完整和一致性;
  • 弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行。

缺点:系统复杂度稍高,需要更多服务器

 1.2 FastDFS简介

 FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务,如相册网站、视频网站等等。

FastDFS特性

  • 文件不分块存储,上传的文件和OS文件系统中的文件一一对应
  • 支持相同内容的文件只保存一份,节约磁盘空间
  • 下载文件支持HTTP协议,可以使用内置Web Server,也可以和其他Web Server配合使用
  • 支持在线扩容
  • 支持主从文件

分布式文件服务提供商

1、阿里的OSS

2、七牛云存储

3、百度云储存

1.3 FastDFS核心概念

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等静态服务器来调用或者做一部分的缓存;存储服务器内部分为卷(或者叫做组),卷于卷之间是平行的关系,可以根据资源的使用情况随时增加,卷内服务器文件相互同步备份,以达到容灾的目的。

1.4 FastDFS上传机制

首先客户端请求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、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

1.5 FastDFS下载机制

客户端带上文件名信息请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求下载文件,存储服务器接收到请求后返回文件给客户端。

内部机制如下

  1. client询问tracker下载文件的storage,参数为文件标识(组名和文件名)
  2. tracker返回一台可用的storage
  3. client直接和storage通讯完成文件下载

 二、Linux搭建FastDFS

2.1 安装FastDFS

下载安装gcc

安装方式为yum安装(需网络):

yum install gcc-c++ perl-devel pcre-devel openssl-devel zlib-devel wget

下载安装FastDFS

wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz

下载安装FastDFS依赖

wgethttps://github.com/happyfish100/libfastcommon/archive/V1.0.43.tar.gz

下载安装FastDFS

wget https://github.com/happyfish100/fastdfs/archive/V6.06.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

2.2 创建tracker服务 

创建tracker目录

mkdir -p  /data/fastdfs/tracker

修改配置文件

vim /etc/fdfs/tracker.conf

disabled=false          #启用配置文件
port=22122            #设置 tracker 的端口号
base_path=/data/fastdfs/tracker #设置 tracker 的数据文件和日志目录(需预先创建)
http.server_port=8888      #设置 http 端口号,指的是在tracker服务器上启动http服务进程,如:apache或者nginx 启动时所监听的端口

启动tracker服务

/etc/init.d/fdfs_trackerd start

检查tracker服务

netstat -lntup |grep fdfs

2.3 创建storage服务

创建storage目录

mkdir -p /data/fastdfs/base   #日志
mkdir -p /data/fastdfs/storage   #文件存储位置

修改配置文件

vim /etc/fdfs/storage.conf


disabled=false             #启用配置文件
group_name=group1           #组名,根据实际情况修改
port=23000               #设置 storage 的端口号
base_path=/data/fastdfs/base      #设置 storage 的日志目录(需预先创建)
store_path_count=1           #存储路径个数,需要和 store_path 个数匹配
store_path0=/data/fastdfs/storage     #存储路径
tracker_server = 192.168.66.100:22122   #tracker 服务器的 IP 地址和端口号
http.server_port=8888         #设置storage上启动的http服务的端口号,如安装的nginx的端口号

启动storage服务

/etc/init.d/fdfs_storaged start

查看storage服务

netstat -lntup |grep fdfs

2.3 配置Client服务

创建client日志文件目录

mkdir -p /data/fastdfs/client

修改client配置文件

vim /etc/fdfs/client.conf

connect_timeout=30
network_timeout=60
base_path=/data/fastdfs/client      # 日志路径
tracker_server=192.168.66.100:22122    # 追踪服务器的IP,有多个服务器可以另一行

 查看启动的服务

ps -ef | grep fdfs

 三、FastDFS指令

 3.1 上传文件指令:fdfs_upload_file

fdfs_upload_file <config_file> <local_filename> [storage_ip:port] [store_path_index]

参数含义:

  1. <config_file> :客户端client配置文件路径
  2. <local_filename> :要上传的文件的地址
  3. [storage_ip:port] :(可选参数)
  4. [store_path_index] :(可选参数)

 示例:

fdfs_upload_file /etc/fdfs/client.conf ./pdx.jpg  #将当前文件夹下的pdx.jpg文件上传到FastDFS

group1/M00/00/00/wKhCZGSzyi6ANZJJAANsTCZQKGY266.jpg  #上传文件后会返回文件在FastDFS中的唯一文件标识,即卷名+文件名

在/data/fastdfs/storage/data/00/00可以查看当前上传的文件

 3.2 下载文件指令

fdfs_download_file <config_file> <file_id> [local_filename] [<download_offset> <download_bytes>

参数含义:

  1. <config_file> :客户端配置文件路径
  2. <file_id> :文件在FastDFS中的唯一文件标识,即卷名+文件名
  3. [local_filename] :文件下载地址
  4. <download_offset> :(可选参数)文件下载开始时间
  5. <download_bytes> :(可选参数)文件下载的字节数

示例:

#将文件下载到当前路径下
fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKhCZGSzyi6ANZJJAANsTCZQKGY266.jpg

3.3 查看文件信息指令

fdfs_file_info <config_file> <file_id>

参数含义:

  1. <config_file> :客户端配置文件路径
  2. <file_id> :文件在FastDFS中的唯一文件标识,即卷名+文件名

示例:

#查看文件的信息
fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKhCZGSzyi6ANZJJAANsTCZQKGY266.jpg

 3.4 删除文件指令

fdfs_delete_file <config_file> <file_id>

参数含义:

  1. <config_file> :客户端配置文件路径
  2. <file_id> :文件在FastDFS中的唯一文件标识,即卷名+文件名

示例:

fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKhCZGSzyi6ANZJJAANsTCZQKGY266.jpg

注意:

删除指令使用后,文件在该卷中的所有备份都会被删除,因为卷内的存储节点会相互同步,故慎用。

 四、SpringBoot操作FastDFS实现文件上传(基本版)

由GitHub大牛tobato在原作者YuQing与yuqih发布的JAVA客户端基础上进行了大量重构工作,并于GitHub上发布了FastDFS-Client1.26.5。 

主要特性

  1. 对关键部分代码加入了单元测试,便于理解与服务端的接口交易,提高接口质量
  2. 将以前对byte硬解析风格重构为使用对象+注解的形式,尽量增强了代码的可读性
  3. 支持对服务端的连接池管理
  4. 支持上传图片时候检查图片格式,并且自动生成缩略图
  5. 在SpringBoot当中自动导入依赖

1、创建springboot项目(2.7.0),导入FastDFS依赖jar 

<dependency>
  <groupId>com.github.tobato</groupId>
  <artifactId>fastdfs-client</artifactId>
  <version>1.26.5</version>
</dependency>

2、添加配置

####分布式文件系统配置###########
fdfs:
  so-timeout: 1500
  connect-timeout: 600
  thumb-image:       #缩略图生成参数
    width: 150
    height: 150
  tracker-list:       #TrackerList参数,支持多个
    - 192.168.66.100:22122
   # - 192.168.66.101:22122

3、编写测试类实现文件上传和文件下载

package com.zj;

import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.io.*;

@SpringBootTest
class FastdfsApplicationTests {

    //通过FastDFS的客户端对象完成对文件系统的操作
    @Resource
    private FastFileStorageClient fastFileStorageClient;

    //测试上传文件
    @Test
    public void upload() throws FileNotFoundException {
        //1.先读取本地文件
        File file = new File("D:\\aaa.jpg");
        //2.创建传输文件输入流
        FileInputStream fileInputStream = new FileInputStream(file);
        //3.文件上传
        /*
         * 参数一:文件输入流
         * 参数二:文件大小
         * 参数三:文件拓展名
         * 参数四:描述文件的元数据(指定文件上传的位置)
         */
        StorePath storePath = fastFileStorageClient.uploadFile(fileInputStream, file.length(), "jpg", null);
        //4.将卷名和文件名一起打印
        System.out.println("上传文件的地址:"+storePath.getFullPath());
        System.out.println("文件卷名:"+storePath.getGroup());
        System.out.println("文件名:"+storePath.getPath());
    }

    //文件下载
    @Test
    public void download() throws IOException {
       //1.下载文件
        /*
         * 参数一:文件处于存储节点的卷名
         * 参数二:文件在存储节点的文件名
         * 参数三:下载的回调函数
         */
        byte[] downloadFile = fastFileStorageClient.downloadFile("group1", "M00/00/00/wKhCZGS2WGaAYKOuADcAPt_yJDw957.jpg", new DownloadByteArray());
         //2.创建文件输出流,并指定文件下载的位置
        FileOutputStream fileOutputStream = new FileOutputStream("d:\\aaa.jpg");
         //3.将文件输出流写文件到磁盘
        fileOutputStream.write(downloadFile);
        //4.刷新
        fileOutputStream.flush();
        //5.关闭流
        fileOutputStream.close();
    }



}

五、spring boot整合FastDFS实现文件上传(完整版)

 1、引入Thymeleaf视图解析器和文件上传客户端对象 

        <!--fastdfs-->
        <dependency>
            <groupId>com.github.tobato</groupId>
            <artifactId>fastdfs-client</artifactId>
            <version>1.26.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

注意:

使用wangeditor富文本编辑器的前提是引入Thymeleaf模板。 

2、通过CDN在前端页面引入wangEditor富文本编辑器

 <script type="text/javascript" src="https://unpkg.com/wangeditor/dist/wangEditor.min.js"></script>

 3、创建编辑器基本骨架

<div id="div1">
    <p>欢迎使用 <b>wangEditor</b> 富文本编辑器</p>
</div>
<script type="text/javascript">
    const E = window.wangEditor;
    const editor = new E('#div1')
    editor.create();
</script>

4、创建文件上传的Controller控制器

package com.zj.controller;

import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;

@RestController
public class uploadController {

    @Resource
    private FastFileStorageClient fastFileStorageClient;

    //图片上传
    @PostMapping("/upload")
    public void upload(MultipartFile file) throws IOException {
      //1.判断文件是否为空
        if(file != null){
            //2.获取上传的图片的名字
            String originalFilename = file.getOriginalFilename();
            //3.获取上传的图片的扩展名
            String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            //4.上传图片
            StorePath storePath = fastFileStorageClient.uploadFile(file.getInputStream(), file.getSize(), suffix, null);
            System.out.println("上传的文件的路径:"+storePath.getFullPath());
            //5.上传的文件路径需要保存到数据库中
            //……
        }
    }
}

文件上传的请求方式必须是post 

5、完整的index.html页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
    <script type="text/javascript" src="https://unpkg.com/wangeditor/dist/wangEditor.min.js"></script>

</head>
<body>
<div id="div1">
    <p>欢迎使用 <b>wangEditor</b> 富文本编辑器</p>
</div>
<script type="text/javascript">
    const E = window.wangEditor;
    const editor = new E('#div1');
    //指定文件上传的服务路径
    editor.config.uploadImgServer = "/upload";
    //文件参数名
    editor.config.uploadFileName = "file";
    //限制文件上传的大小和类型 2M
    editor.config.uploadImgMaxSize = 2 * 1024 * 1024;
    //文件上传的类型
    editor.config.uploadImgAccept = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'];

    editor.create();
</script>

</body>
</html>

6、启动项目,上传图片即可

六、FastDFS整合Nginx

  Nginx服务器是一个高性能的web服务器与反向代理服务器。

FastDFS集成Nginx的2个原因

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

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

注意:

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

  2.解决复制延迟问题

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

 环境搭建

下载Fastdfs的Nginx模块包

#选择安装位置
cd /usr/local

#下载文件(或者使用本文章已经下载好的文件)
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.22.tar.gz

#解压文件
tar -zxvf V1.22.tar.gz

在ginx-1.20.2目录下安装Nginx依赖文件

yum install -y gcc gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel gd-devel epel-release

配置Nginx服务器

#建立Makefile文件,检查Linux系统环境以及相关的关键属性。添加fastdfs-nginx-module-1.22模块到nginx
./configure --add-module=/usr/local/fastdfs-nginx-module-1.22/src/

#编译项目,主要将gcc源代码编译成可执行的目标文件
make

#根据上一步骤编译完成的数据安装到预定的目录中。之前安装过ngxin的话不需要再安装
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模块,并编辑文件

#拷贝文件
[root@localhost opt]cp /usr/local/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/

[root@localhost 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

server {
  listen    80;
  server_name  localhost;
   
  location ~ /group[1-3]/M00 {
    alias /data/fastdfs/storage/data;
     ngx_fastdfs_module;
   }
  # 根目录下返回403
  location = / {
     return 403;
   }
  # log file
  access_log  logs/img_access.log access;
}

启动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 /]# fdfs_upload_file /etc/fdfs/client.conf pdx.jpg
group1/M00/00/00/wKhCZGS6zneAUxGKAANsTCZQKGY401.jpg

通过浏览器远程访问

http://192.168.66.100/group1/M00/00/00/wKhCZGS6zneAUxGKAANsTCZQKGY401.jpg

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

已实现商业化却仍陷亏损泥潭,瑕瑜错陈的觅瑞集团求上市

撰稿|行星 来源|贝多财经 7月25日&#xff0c;Mirxes Holding Company Limited-B&#xff08;以下简称“觅瑞集团”&#xff09;向港交所递交上市申请材料&#xff0c;计划在港交所主板上市&#xff0c;中金公司和建银国际为其联席保荐人。 据招股书介绍&#xff0c;成立于2…

Spring中如何用注解方式存取JavaBean?有几种注入方式?

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE进阶 本篇文章将讲解如何在spring中使用注解的方式来存取Bean对象&#xff0c;spring提供了多种注入对象的方式&#xff0c;常见的注入方式包括 构造函数注入&#xff0c;Setter 方法注入和属性…

字节跳动 EB 级 Iceberg 数据湖的机器学习应用与优化

深度学习的模型规模越来越庞大&#xff0c;其训练数据量级也成倍增长&#xff0c;这对海量训练数据的存储方案也提出了更高的要求&#xff1a;怎样更高性能地读取训练样本、不使数据读取成为模型训练的瓶颈&#xff0c;怎样更高效地支持特征工程、更便捷地增删和回填特征。本文…

[OnWork.Tools]系列 02-安装

下载地址 百度网盘 历史版本连接各种版本都有,请下载版本号最高的版本 链接&#xff1a;https://pan.baidu.com/s/1aOT0oUhiRO_L8sBCGomXdQ?pwdn159提取码&#xff1a;n159 个人链接 http://on8.top:5000/share.cgi?ssiddb2012fa6b224cd1b7f87ff5f5214910 软件安装 双…

Rust之泛型、特性和生命期(四):验证有生存期的引用

开发环境 Windows 10Rust 1.71.0 VS Code 1.80.1 项目工程 这里继续沿用上次工程rust-demo 验证具有生存期的引用 生存期是我们已经在使用的另一种泛型。生存期不是确保一个类型具有我们想要的行为&#xff0c;而是确保引用在我们需要时有效。 我们在第4章“引用和借用”一…

SpringCloud学习路线(13)——分布式搜索ElasticSeach集群

前言 单机ES做数据存储&#xff0c;必然面临两个问题&#xff1a;海量数据的存储&#xff0c;单点故障。 如何解决这两个问题&#xff1f; 海量数据的存储问题&#xff1a; 将索引库从逻辑上拆分为N个分片&#xff08;shard&#xff09;&#xff0c;存储到多个节点。单点故障…

新增WebDB和ChatGPT组件,支持对ChatGPT资产进行纳管,JumpServer堡垒机v3.5.0发布

2023年7月24日&#xff0c;JumpServer开源堡垒机正式发布v3.5.0版本。在这一版本中&#xff0c;新生代数据库连接组件——问题终结者Chen强势来袭&#xff0c;替代原有的OmniDB组件&#xff0c;在兼容旧版本的同时&#xff0c;解决了旧组件性能不足的问题&#xff0c;为用户提供…

微信小程序开发之配置菜单跳转到自定义页面

需求: 用户点击公众号菜单跳转到自定义带引流码的链接 公众号相关文档: 网页授权 | 微信开放文档 大致流程: 1.在公众号菜单配置链接: https://open.weixin.qq.com/connect/oauth2/authorize?appidXXXXXXXXXXXX&redirect_urihttps%3A%2F%2F测试域名%2Fws_dabai%2Fwe…

NoSQL-Redis持久化

NoSQL-Redis持久化 一、Redis 高可用&#xff1a;1.概述&#xff1a; 二、Redis持久化&#xff1a;1.持久化的功能&#xff1a;2.Redis 提供两种方式进行持久化&#xff1a; 三、RDB 持久化&#xff1a;1.定义&#xff1a;2.触发条件&#xff1a;3.执行流程&#xff1a;4.启动时…

HDFS的设计目标和重要特性

HDFS的设计目标和重要特性 设计目标HDFS重要特性主从架构分块存储机制副本机制namespace元数据管理数据块存储 设计目标 硬件故障(Hardware Failure)是常态&#xff0c;HDFS可能有成百上千的服务器组成&#xff0c;每一个组件都有可能出现故障。因此古见检测和自动快速恢复的H…

选择合适的图表,高效展现数据魅力

随着大数据时代的来临&#xff0c;数据的重要性愈发凸显&#xff0c;数据分析和可视化成为了决策和传递信息的重要手段。在数据可视化中&#xff0c;选择合适的图表是至关重要的一环&#xff0c;它能让数据更加生动、直观地呈现&#xff0c;为观众提供更有说服力的信息。本文将…

JavaScript 练手小技巧:音乐播放器的歌词显示

暑假了&#xff0c;还是不能让自己闲着&#xff0c;学点自己感兴趣的知识&#xff0c;写点自己喜欢的代码。 今天写了一个播放器的雏形&#xff0c;带歌词显示。 没去自定义播放器&#xff0c;主要是写歌词显示效果。效果图如下&#xff1a; 首先当然是要准备一个 mp3 文件。 …

RocketMQ基本概念与入门

文章目录 MQ基本结构依赖案例:productConsumer 核心概念1.nameserver2.broker3.主题队列4.queue队列5. 生产者6.消费者分组和生产者分组7.消费点位 MQ基本结构 message: 消息数据对象product: 程序代码,生成消息,发送消息到队列consumer: 程序代码,监听(绑定)队列,获取消息,执行…

分布式锁:Redis、Zookeeper

1.基于Redis实现分布式锁&#xfeff; Redis分布式锁原理如上图所示&#xff0c;当有多个Set命令发送到Redis时&#xff0c;Redis会串行处理&#xff0c;最终只有一个Set命令执行成功&#xff0c;从而只有一个线程加锁成功 2.SetNx命令加锁 利用Redis的setNx命令在Redis数据库…

数据结构【绪论】

数据结构入门级 第一章绪论 什么是数据结构&#xff1f;什么是数据类型&#xff1f; 程序数据结构算法 一、基本概念&#xff1a; 数据&#xff1a;指所有能被计算机处理的&#xff0c;无论图、文字、符号等。数据元素&#xff1a;数据的基本单位&#xff0c;通常作为整体考…

Unity TMP (TextMeshPro) 创建字体材质

1 TMP 简介 完整名称&#xff1a;Text Mesh Pro &#xff0c;unity新一代主流字体插件 1.1 组件变化 内置的Text组件以及与内置Text组件绑定的Button、DropDown、InputField均被替换为使用TextMeshPro的版本 内置的Text组件以及与内置Text组件绑定的Button、DropDown、Input…

tinymce插件tinymce-powerpaste-plugin——将word中内容(文字图片等)直接粘贴至tinymce编辑器中

TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。同类程序有&#xff1a;UEditor、Kindeditor、Simditor、CKEditor、wangEditor、Suneditor、froala等等。 TinyMCE的优势&#xff1a; 开源可商用&#xff0c;基于LGPL2.1 插件丰富&#xff0c;自带插件基本涵盖日常…

【项目设计】基于负载均衡的在线oj平台

目录 一、项目介绍 二、开发环境以及技术 三、概要设计 四、关键算法 五、项目演示 六、代码实现 一、项目介绍 该项目是基于负载均衡的在线oj&#xff0c;模拟平时刷题网站&#xff08;leetcode和牛客&#xff09;写的一个在线判题系统 项目主要分为五个模块&#xff…

OpenAI重磅官宣ChatGPT安卓版本周发布,现已开启下载预约,附详细预约教程

7月22号&#xff0c;OpenAI 突然宣布&#xff0c;安卓版 ChatGPT 将在下周发布&#xff01;换句话说&#xff0c;本周安卓版 ChatGPT正式上线&#xff01; 最早&#xff0c;ChatGPT仅有网页版。 今年5月&#xff0c;iOS版ChatGPT正式发布&#xff0c;当时OpenAI表示Android版将…

Docker—— consul的容器服务更新与发现

Docker—— consul的容器服务更新与发现 一、Consul概述1.什么是服务注册与发现2.什么是consul 二、consul 部署1.consul服务器①. 建立 Consul 服务②. 查看集群信息③. 通过 http api 获取集群信息 2.registrator服务器①. 安装 Gliderlabs/Registrator②. 测试服务发现功能是…