DataX案例实操

news2025/1/16 12:52:47

1、DataX使用

1.1、DataX任务提交命令

DataX的使用十分简单,用户只需根据自己同步数据的数据源和目的地选择相应的Reader和Writer,并将Reader和Writer的信息配置在一个json文件中,然后执行如下命令提交数据同步任务即可。

[song@hadoop102 datax]$ python /opt/model/datax/bin/datax.py /opt/model/datax/job/job.json

1.2、DataX配置文件格式

可以使用如下命名查看DataX配置文件模板。

[song@hadoop102 datax]$ python bin/datax.py -r mysqlreader -w hdfswriter

在这里插入图片描述
配置文件模板如下:
json最外层是一个job,job包含setting和content两部分,其中setting用于对整个job进行配置,content用户配置数据源和目的地。
在这里插入图片描述
Reader和Writer的具体参数可参考官方文档,地址如下:
Reader和Writer的具体参数参考官方文档
在这里插入图片描述

2、DataX使用案例

2.1、同步MySQL数据到HDFS案例

2.1.1、案例要求

同步gmall数据库中base_province表数据到HDFS的/base_province目录

2.1.2、需求分析

要实现该功能,需选用MySQLReader和HDFSWriter,MySQLReader具有两种模式分别是TableModeQuerySQLMode,前者使用table,column,where等属性声明需要同步的数据;后者使用一条SQL查询语句声明需要同步的数据。下面分别使用两种模式进行演示。

2.1.2.1、MySQLReader之TableMode
  1. 数据准备:Mysql数据表
/*
 Navicat Premium Data Transfer

 Source Server         : hadoop102
 Source Server Type    : MySQL
 Source Server Version : 80026
 Source Host           : 192.168.10.102:3306
 Source Schema         : gmall

 Target Server Type    : MySQL
 Target Server Version : 80026
 File Encoding         : 65001

 Date: 04/02/2023 13:53:48
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for base_province
-- ----------------------------
DROP TABLE IF EXISTS `base_province`;
CREATE TABLE `base_province`  (
  `id` bigint(0) NULL DEFAULT NULL COMMENT 'id',
  `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '省名称',
  `region_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '大区id',
  `area_code` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '行政区位码',
  `iso_code` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '国际编码',
  `iso_3166_2` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'ISO3166编码'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of base_province
-- ----------------------------
INSERT INTO `base_province` VALUES (1, '北京', '1', '110000', 'CN-11', 'CN-BJ');
INSERT INTO `base_province` VALUES (2, '天津', '1', '120000', 'CN-12', 'CN-TJ');
INSERT INTO `base_province` VALUES (3, '山西', '1', '140000', 'CN-14', 'CN-SX');
INSERT INTO `base_province` VALUES (4, '内蒙古', '1', '150000', 'CN-15', 'CN-NM');
INSERT INTO `base_province` VALUES (5, '河北', '1', '130000', 'CN-13', 'CN-HE');
INSERT INTO `base_province` VALUES (6, '上海', '2', '310000', 'CN-31', 'CN-SH');
INSERT INTO `base_province` VALUES (7, '江苏', '2', '320000', 'CN-32', 'CN-JS');
INSERT INTO `base_province` VALUES (8, '浙江', '2', '330000', 'CN-33', 'CN-ZJ');
INSERT INTO `base_province` VALUES (9, '安徽', '2', '340000', 'CN-34', 'CN-AH');
INSERT INTO `base_province` VALUES (10, '福建', '2', '350000', 'CN-35', 'CN-FJ');
INSERT INTO `base_province` VALUES (11, '江西', '2', '360000', 'CN-36', 'CN-JX');
INSERT INTO `base_province` VALUES (12, '山东', '2', '370000', 'CN-37', 'CN-SD');
INSERT INTO `base_province` VALUES (14, '台湾', '2', '710000', 'CN-71', 'CN-TW');
INSERT INTO `base_province` VALUES (15, '黑龙江', '3', '230000', 'CN-23', 'CN-HL');
INSERT INTO `base_province` VALUES (16, '吉林', '3', '220000', 'CN-22', 'CN-JL');
INSERT INTO `base_province` VALUES (17, '辽宁', '3', '210000', 'CN-21', 'CN-LN');
INSERT INTO `base_province` VALUES (18, '陕西', '7', '610000', 'CN-61', 'CN-SN');
INSERT INTO `base_province` VALUES (19, '甘肃', '7', '620000', 'CN-62', 'CN-GS');
INSERT INTO `base_province` VALUES (20, '青海', '7', '630000', 'CN-63', 'CN-QH');
INSERT INTO `base_province` VALUES (21, '宁夏', '7', '640000', 'CN-64', 'CN-NX');
INSERT INTO `base_province` VALUES (22, '新疆', '7', '650000', 'CN-65', 'CN-XJ');
INSERT INTO `base_province` VALUES (23, '河南', '4', '410000', 'CN-41', 'CN-HA');
INSERT INTO `base_province` VALUES (24, '湖北', '4', '420000', 'CN-42', 'CN-HB');
INSERT INTO `base_province` VALUES (25, '湖南', '4', '430000', 'CN-43', 'CN-HN');
INSERT INTO `base_province` VALUES (26, '广东', '5', '440000', 'CN-44', 'CN-GD');
INSERT INTO `base_province` VALUES (27, '广西', '5', '450000', 'CN-45', 'CN-GX');
INSERT INTO `base_province` VALUES (28, '海南', '5', '460000', 'CN-46', 'CN-HI');
INSERT INTO `base_province` VALUES (29, '香港', '5', '810000', 'CN-91', 'CN-HK');
INSERT INTO `base_province` VALUES (30, '澳门', '5', '820000', 'CN-92', 'CN-MO');
INSERT INTO `base_province` VALUES (31, '四川', '6', '510000', 'CN-51', 'CN-SC');
INSERT INTO `base_province` VALUES (32, '贵州', '6', '520000', 'CN-52', 'CN-GZ');
INSERT INTO `base_province` VALUES (33, '云南', '6', '530000', 'CN-53', 'CN-YN');
INSERT INTO `base_province` VALUES (13, '重庆', '6', '500000', 'CN-50', 'CN-CQ');
INSERT INTO `base_province` VALUES (34, '西藏', '6', '540000', 'CN-54', 'CN-XZ');

SET FOREIGN_KEY_CHECKS = 1;

  1. 创建配置文件base_province.json
    在这里插入图片描述
  2. 配置文件内容如下
{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "column": [
                            "id",
                            "name",
                            "region_id",
                            "area_code",
                            "iso_code",
                            "iso_3166_2"
                        ],
                        "where": "id>=3",
                        "connection": [
                            {
                                "jdbcUrl": [
                                    "jdbc:mysql://hadoop102:3306/gmall"
                                ],
                                "table": [
                                    "base_province"
                                ]
                            }
                        ],
                        "password": "123456",
                        "splitPk": "",
                        "username": "root"
                    }
                },
                "writer": {
                    "name": "hdfswriter",
                    "parameter": {
                        "column": [
                            {
                                "name": "id",
                                "type": "bigint"
                            },
                            {
                                "name": "name",
                                "type": "string"
                            },
                            {
                                "name": "region_id",
                                "type": "string"
                            },
                            {
                                "name": "area_code",
                                "type": "string"
                            },
                            {
                                "name": "iso_code",
                                "type": "string"
                            },
                            {
                                "name": "iso_3166_2",
                                "type": "string"
                            }
                        ],
                        "compress": "gzip",
                        "defaultFS": "hdfs://hadoop102:8020",
                        "fieldDelimiter": "\t",
                        "fileName": "base_province",
                        "fileType": "text",
                        "path": "/base_province",
                        "writeMode": "append"
                    }
                }
            }
        ],
        "setting": {
            "speed": {
                "channel": 1
            }
        }
    }
}
  1. 参数说明
    • Reader参数说明
      在这里插入图片描述

    • Writer参数说明
      在这里插入图片描述

    • Setting参数说明
      在这里插入图片描述

注意事项
当Mysql中存在Null值的时候。默认情况下写入到HFDS中的是以空字符串(‘’")进行存储的,而Hive默认的null值存储格式为“\N”,当HDFS中的null值是“\N”存储的,Hive可以展示位null值,但是HFDS Writer并未提供nullFormat参数,现在出现的问题是:当mysql中的Null存储到hdfs是空字符串,hive读取hdfs中的空字符串,显示的也是空字符串,造成两种数据格式不一致。

解决该问题的方案有两个:

  • 修改DataX HDFS Writer的源码,增加自定义null值存储格式的逻辑,可参考添加链接描述。
  • 在Hive中建表时指定null值存储格式为空字符串(‘’ ‘’),例如
DROP TABLE IF EXISTS base_province;
CREATE EXTERNAL TABLE base_province
(
    `id`         STRING COMMENT '编号',
    `name`       STRING COMMENT '省份名称',
    `region_id`  STRING COMMENT '地区ID',
    `area_code`  STRING COMMENT '地区编码',
    `iso_code`   STRING COMMENT '旧版ISO-3166-2编码,供可视化使用',
    `iso_3166_2` STRING COMMENT '新版IOS-3166-2编码,供可视化使用'
) COMMENT '省份表'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    NULL DEFINED AS ''
    LOCATION '/base_province/';
  1. 提交任务
    • 在HDFS创建/base_province目录,使用DataX向HDFS同步数据时,需确保目标路径已存在
      在这里插入图片描述
      在这里插入图片描述
    • 进入DataX根目录,执行任务
      在这里插入图片描述
      但是出现了以下的错误:
      在这里插入图片描述
      原因的是因为我使用的是Mysql8.x,而DataX中的Mysql驱动是5.x,解决方案就是datax里面的mysql驱动更换成合适的8.x的版本就好了:
      将datax->plugins->reader->mysqlreader->libs->mysql-connector-5…的jar包换成8.XX的版本

重新执行即可。

  1. 查看结果
    在这里插入图片描述
    在这里插入图片描述
  2. 查看HDFS文件
[song@hadoop102 datax]$ hadoop fs -cat /base_province/* | zcat

在这里插入图片描述

2.1.2.2、MySQLReader之QuerySQLMode
  1. 编写执行文件
{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "connection": [
                            {
                                "jdbcUrl": [
                                    "jdbc:mysql://hadoop102:3306/gmall?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8"
                                ],
                                "querySql": [
                                    "select id,name,region_id,area_code,iso_code,iso_3166_2 from base_province where id>=3"
                                ]
                            }
                        ],
                        "password": "000000",
                        "username": "root"
                    }
                },
                "writer": {
                    "name": "hdfswriter",
                    "parameter": {
                        "column": [
                            {
                                "name": "id",
                                "type": "bigint"
                            },
                            {
                                "name": "name",
                                "type": "string"
                            },
                            {
                                "name": "region_id",
                                "type": "string"
                            },
                            {
                                "name": "area_code",
                                "type": "string"
                            },
                            {
                                "name": "iso_code",
                                "type": "string"
                            },
                            {
                                "name": "iso_3166_2",
                                "type": "string"
                            }
                        ],
                        "compress": "gzip",
                        "defaultFS": "hdfs://hadoop102:8020",
                        "fieldDelimiter": "\t",
                        "fileName": "base_province",
                        "fileType": "text",
                        "path": "/base_province",
                        "writeMode": "append"
                    }
                }
            }
        ],
        "setting": {
            "speed": {
                "channel": 1
            }
        }
    }
}
  1. 查看结果
    在这里插入图片描述
    在这里插入图片描述

2.2、DataX传参

通常情况下,离线数据同步任务需要每日定时重复执行,故HDFS上的目标路径通常会包含一层日期,以对每日同步的数据加以区分,也就是说每日同步数据的目标路径不是固定不变的,因此DataX配置文件中HDFS Writer的path参数的值应该是动态的。

为实现这一效果,就需要使用DataX传参的功能。DataX传参的用法如下,在JSON配置文件中使用${param}引用参数,在提交任务时使用-p"-Dparam=value"传入参数值,具体示例如下。

  1. 编写配置文件
[song@hadoop102 job]$ vim base_province_date.json
{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "connection": [
                            {
                                "jdbcUrl": [
                                    "jdbc:mysql://hadoop102:3306/gmall?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8"
                                ],
                                "querySql": [
                                    "select id,name,region_id,area_code,iso_code,iso_3166_2 from base_province where id>=3"
                                ]
                            }
                        ],
                        "password": "000000",
                        "username": "root"
                    }
                },
                "writer": {
                    "name": "hdfswriter",
                    "parameter": {
                        "column": [
                            {
                                "name": "id",
                                "type": "bigint"
                            },
                            {
                                "name": "name",
                                "type": "string"
                            },
                            {
                                "name": "region_id",
                                "type": "string"
                            },
                            {
                                "name": "area_code",
                                "type": "string"
                            },
                            {
                                "name": "iso_code",
                                "type": "string"
                            },
                            {
                                "name": "iso_3166_2",
                                "type": "string"
                            }
                        ],
                        "compress": "gzip",
                        "defaultFS": "hdfs://hadoop102:8020",
                        "fieldDelimiter": "\t",
                        "fileName": "base_province",
                        "fileType": "text",
                        "path": "/base_province/${dt}",
                        "writeMode": "append"
                    }
                }
            }
        ],
        "setting": {
            "speed": {
                "channel": 1
            }
        }
    }
}
  1. 创建目标路径: hadoop fs -mkdir /base_province/2023-02-04
    在这里插入图片描述

  2. 执行命令:python bin/datax.py -p"-Ddt=2023-02-04" job/base_province_date.json
    在这里插入图片描述

  3. 查看结果
    在这里插入图片描述
    在这里插入图片描述

2.3、同步HDFS数据到MySQL案例

2.3.1、案例要求

同步HDFS上的/base_province目录下的数据到MySQL gmall 数据库下的test_province表。

2.3.2、需求分析

要实现该功能,需选用HDFSReader和MySQLWriter。

  1. 编写配置文件
    创建配置文件test_province.json
{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "hdfsreader",
                    "parameter": {
                        "defaultFS": "hdfs://hadoop102:8020",
                        "path": "/base_province",
                        "column": [
                            "*"
                        ],
                        "fileType": "text",
                        "compress": "gzip",
                        "encoding": "UTF-8",
                        "nullFormat": "\\N",
                        "fieldDelimiter": "\t",
                    }
                },
                "writer": {
                    "name": "mysqlwriter",
                    "parameter": {
                        "username": "root",
                        "password": "000000",
                        "connection": [
                            {
                                "table": [
                                    "test_province"
                                ],
                                "jdbcUrl": "jjdbc:mysql://hadoop102:3306/gmall?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8"
                            }
                        ],
                        "column": [
                            "id",
                            "name",
                            "region_id",
                            "area_code",
                            "iso_code",
                            "iso_3166_2"
                        ],
                        "writeMode": "replace"
                    }
                }
            }
        ],
        "setting": {
            "speed": {
                "channel": 1
            }
        }
    }
}

test_province表结构

/*
 Navicat Premium Data Transfer

 Source Server         : hadoop102
 Source Server Type    : MySQL
 Source Server Version : 80026
 Source Host           : hadoop102:3306
 Source Schema         : gmall

 Target Server Type    : MySQL
 Target Server Version : 80026
 File Encoding         : 65001

 Date: 04/02/2023 15:13:43
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for test_province
-- ----------------------------
DROP TABLE IF EXISTS `test_province`;
CREATE TABLE `test_province`  (
  `id` bigint(0) NOT NULL COMMENT 'id',
  `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '省名称',
  `region_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '大区id',
  `area_code` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '行政区位码',
  `iso_code` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '国际编码',
  `iso_3166_2` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'ISO3166编码',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;


  1. Reader参数说明
    在这里插入图片描述

  2. Writer参数说明
    在这里插入图片描述

  3. 提交任务,在MySQL中创建gmall.test_province表

  4. 执行如下命令,python bin/datax.py job/test_base_province.json

[song@hadoop102 datax]$ python bin/datax.py job/test_base_province.json
  1. 查看结果
    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

JavaScript 进阶5:WebAPI:DOM- 网页特效篇

JavaScript 进阶5:WebAPI:DOM- 网页特效篇 Date: January 28, 2023 Text: 轮播图高级版待解决 滚动事件、加载事件、元素大小和位置(scroll、offset、client)、轮播图案例 目标 能够制作常见的网页特效具备制作常见网页焦点图的…

WebRTC音频系统 之audio技术栈简介-1

文章目录第一章 WebRTC技术栈简介1.1 视频会议中常见的服务端架构1.2 WebRTC 网络协议栈1.3 WebRTC 源码目录结构1.4 client侧技术栈1.5 WebRTC native编译以及debug1.6 APM模块1.7 ADM模块WebRTC是Google开源的Web实时音视频通信框架,其提供P2P的音频、视频和一般数…

PTA---寒假温故知新作业

🚀write in front🚀 📝个人主页:认真写博客的夏目浅石. 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:PTA学校题集 💬总结:希望你看完之后&a…

Python Fiddler最新抓包工具教学:快速获取公众号(pc客户端)公开数据

嗨害大家好鸭~ 我是小熊猫 之前的Fiddler版本过期了,现在再来补上一个小案例 源码资料电子书:点击此处跳转文末名片获取 开发环境 - python 3.8 运行代码 - pycharm 2021.2 辅助敲代码 - requests第三方模块 - Fiddler 汉化版 抓包的工具 - 微信PC端 如何抓包 配置…

Python 初学者进阶的九大技能

Python是一种很棒的语言,语法简单,无需在代码中搜索分号。对于初学者来说,Python是入门最简单的语言之一。 Python有大量的库支持,你还可以安装其他库来增加自己的编程经验。 学了一阵子之后,你可能会觉得&#xff1…

成功解决使用yum安装的php版本过低的问题

文章目录前言一. 问题复现二. 问题分析三. 问题解决:四. 重要补充1. yum-config-manager介绍2. yum-uitls介绍3. remi资源库的介绍总结前言 大家好,我是沐风晓月。 日常学习过程经常会遇到一些奇奇怪怪的问题,为了把每个问题记录下来&#…

2023Facebook该如何养号?Facebook防封指南了解一下!

Facebook是大多数跨境电商卖家主攻的社交媒体平台,但也经常会有卖家抱怨,Facebook账号又无缘无故地被封了。Facebook是公认的非常容易被封,而新开的账号,不仅会导致前期的积累化为乌有,同时新账号被封的可能性也更高。…

python基于融合SPD-Conv改进yolov5与原生yolov5模型实践路面裂痕裂缝检测

SPD-Conv源于2022年一篇专门针对于小目标和低分辨率图像研究提出来的新技术,可以用于目标检测任务,能够一定程度提升模型的检测效果,今天正好有时间就想基于SPD融合yolov5s模型来开发路面裂痕裂缝检测模型,同时与原生的yolov5s模型…

Jenkins配置和使用

Jenkins的使用过程:配置代码库,然后配置代码静态检查,配置编译,配置单元测试,部署测试环境部署,测试,部署staging环境,测试通过,部署product环境 常见插件: git docker k8s maven grandle join Copy artifact ssh访问模式master agent (1)安装J…

线性代数 - 期末复习

SDU 线性代数 - 期末复习(无二次型部分)第一章: 矩阵1. 矩阵概念2. 矩阵运算💙1)线性运算:1》加、减法:2》数乘💙2)乘法运算💙3)矩阵的转置3. 方阵…

什么是RTK基站?它的工作原理是什么

欢迎来到东用知识小课堂!说到定位,相信大家一定不会觉得陌生。如今我们所处的信息时代,人人都有手机。每天,我们都会用到与地图和导航有关的APP。这些APP,就是基于定位技术的。说到定位技术呢,大家又肯定会…

行为型模式-解释器模式

1.概述 如上图,设计一个软件用来进行加减计算。我们第一想法就是使用工具类,提供对应的加法和减法的工具方法。 //用于两个整数相加 public static int add(int a,int b){return a b; } //用于两个整数相加 public static int add(int a,int b,int c){…

OAuth2(三)

首先把项目在本地运行起来 注意redis的配置 在地址栏输入 自动跳断点 界面截图

.NET MAUI 开发电子木鱼(上)

本文介绍如何使用 .NET MAUI 开发一个电子木鱼应用。以实际的小应用开发为例,通过这个开发过程,介绍了其涉及的 .NET MAUI、Blazor、前端等相关知识点。文章涉及的应用已开源在 Github,大家可前往下载体验: https://github.com/sa…

[架构之路-99]:《软件架构设计:程序员向架构师转型必备》-9-确定关键性需求与决定系统架构的因素

第9章 确定关键性需求与决定系统架构的因素9.1 概念架构是什么9.1.1 概念架构是直指目标的设计思想、重大选择9.1.2 案例1:汽车电子AUTOSAR——跨平台复用NA9.1.3 案例2:腾讯QQvideo架构——高性能NA9.1.4 案例3:微软MFC架构——简化开发NA9.…

断网后,是否能够ping通127.0.0.1?

引言 说起这个问题很搞笑,其实也是挺有意思的。是这么回事,公司突然断网了,有人突然来了一句,断网了,能不能ping通127.0.0.1呢?大家就实验起来了! 结果显而易见,如上图,…

什么时候可以不进行测试?

如果存在任何原因导致不需要使用测试结果提供的信息,就没有必要进行测试。测试得到的信息不可靠,也没有必要测试。 1、测试后风险增加 软件行业的经理经常需要做出带风险的决定,通常在获得部分信息的情况下做出决定是比较保险的。但有些时候…

沿着数字中国的大江大河,领略云上三峡

长年以来,提到沿江旅行,国人脑海中浮现的画面一定是三峡。而在今天,沿着数字中国的大江大河溯源而上,也会看到一座云上三峡。郦道元在《水经注》里是这样描写三峡的“至于夏水襄陵,沿溯阻绝。有时朝发白帝,…

Docker - 11. 本地镜像发布到私有库

1. 为什么要有私有库? 如果涉及到公司机密文件,使用DockerHub、阿里云这样的公共镜像仓库就不合适,所以需要创建一个本地私人仓库提供给团队使用,基于公司内部项目构建镜像。而 Docker Registry是官方提供的工具,可以…

【技术应用】java实现排行榜方案

【技术应用】java实现排行榜方案一、前言二、实现方案方案一、通过数据库实现方案二、通过集合List实现数据排序功能方案三、通过redis的zset实现方案四、通过java中的sortedSet集合实现方案五、通过java的priorityQueue队列实现一、前言 最近在做一个项目的性能优化&#xff…