MySQL快速生成大量测试数据 (脚本一键生成分表数据)

news2024/11/15 8:31:08

    生成128个分表的测试数据敲到手累;

    生成的测试数据虽然有离散分布,但随着时间的增长数据量不增反降,不符合大多数线上业务的增长趋势;

    生成的测试数据部分超过当前日期。

具体表现如下图所示:

 

 

我们直接看下脚本的用法及效果(文末附脚本源码)

    [root@VM-0-6-centos ~]# sh createTestData.sh --help
    Usage:  sh createTestData.sh ${mysqlHost} ${mysqlPort} ${mysqlUser} ${mysqlPwd} ${DBName} ${tableName} ${runBatch}
    Usage1: sh createTestData.sh localhost 3306 root '123456' 'test' 'testTable' 20              # 在test库中生成testTable表,记录数为104万+
    Usage2: sh createTestData.sh localhost 3306 root '123456' 'test' 'testTable_{1..10}' 20      # 在test库中生成testTable_1、testTable_2......testTable_10共10张表,每表表记录数为104万+
    Usage2: sh createTestData.sh localhost 3306 root '123456' 'test' 'testTable_{01..10}' 20     # 在test库中生成testTable_01、testTable_02......testTable_10共10张表,每表表记录数为104万+
            注意:'testTable_{1..10}' 要用单引号引起来
     
    runBatch是循环次数:
    ------------------------------------
            runBatch=15生成32768记录
            runBatch=16生成65536记录
            runBatch=17生成13万+记录
            runBatch=18生成26万+记录
            runBatch=19生成52万+记录
            runBatch=20生成104万+记录
            runBatch=21生成209万+记录
            runBatch=22生成419万+记录
            runBatch=23生成838万+记录
            runBatch=24生成1677万+记录
            runBatch=25生成3355万+记录
            runBatch=26生成6710万+记录
            runBatch=27生成1.3亿+记录

 --help参数,可以看到有三种用法举例:

    第一种是在test库(test库需要先手工创建)生成一张表名叫testTable的104万+记录的单表测试数据;

    第二种是在test库生成表名为testTable_1、testTable_2、testTable_3......testTable_10共10张表,每张表的记录是104万+;

    第三种和第二种差不多,只是分表的表名有所区别,当分表是个位数时补0,例如testTable_01、testTable_02、testTable_03......。

下面我们演示生成testTable_01~testTable_10这十张表的过程:

 

这样就生成了十张分表的测试表和测试数据,且生成的数据更接近实际业务情况。如下:

 

当前日期2021-08-09,生成的测试数据都是当天之前的,且从分布上来看,随着时间的推移,注册人数越来越多(八月的数据少是因为截止到目前,八月只有9天数据),这和现实中的大多数产品表现基本一致。

附:shell脚本代码-createTestData.sh

   #!/bin/bash
#
#Author: 
#Date: 2021-06-08
#Description: 快速创建多个表及测试数据
#Usage: 请查看--help
source /etc/profile
source ~/.bash_profile
 
 
############################################################# 功能函数 Begin ##################################################################

        #显示消息
        #showType='errSysMsg/errSys/errUserMsg/warning/msg/msg2/OK'
        #错误输出(以红色字体输出) errSysMsg:捕捉系统错误后发现相信并退出;errSys:捕捉到系统错误后退出;errUserMsg:自定义错误并退出,但不退出(errSysMsg及errUserMsg可以赋第三个参数isExit为非1来控制不退出)
        #警告(以黄色字体输出)  warning:显示warning,但不退出
        #显示信息(以白色字体输出,OK以绿色输出) msg:输出信息并换行;msg2:输出信息不换行;OK:输出绿色OK并换行

        function showMsg()
        {
                errState=${PIPESTATUS[0]}
                #errState="$?"
                #showMsgTestMode=1      #如果设为1,则把有exit 1均改为return 0,便于调试其中函数
                local showType="$1"
                local showContent="$2"
                local isExit="$3"
                #如果isExit为空,则默认出错时该退出
                if [ "${isExit}" = "" ]; then
                        isExit=1
                fi
                isShowRelation=`echo "${pid}" | sed "s/-->/\n0x01_Flag/g" | grep "0x01_Flag" | wc -l`
                showType=`echo ${showType} | tr 'A-Z' 'a-z'`
                case "${showType}" in
                        errsysmsg)
                                if [ "${errState}" -ne 0 ]; then
                                        echo -e "\033[31;49;1m[`date +%F' '%T`] Error: ${showContent}\033[39;49;0m" | tee -a ${logFile} >&2
                                        if [ "${isShowRelation}" -gt 1 ]; then  # 调用层次超过1次时才显示调用关系
                                                echo -e "\033[31;49;1m[`date +%F' '%T`] Call Relation: bash${pid}\033[39;49;0m" | tee -a ${logFile} >&2
                                        fi
                                        if [ "${isExit}" -eq 1 ]; then
                                                if [ "${showMsgTestMode}" = "1" ]; then
                                                        return 1
                                                else
                                                        exit 1
                                                fi
                                        fi
                                fi
                        ;;
                        errsys)
                                if [ "$errState" -ne 0 ]; then
                                        if [ "${isExit}" -eq 1 ]; then
                                                if [ "${showMsgTestMode}" = "1" ]; then
                                                        return 1
                                                else
                                                        exit 1
                                                fi
                                        fi
                                fi
                        ;;
                        errusermsg)
                                echo -e "\033[31;49;1m[`date +%F' '%T`] Error: ${showContent}\033[39;49;0m"  | tee -a ${logFile} >&2
                                if [ "${isShowRelation}" -gt 1 ]; then  # 调用层次超过1次时才显示调用关系
                                        echo -e "\033[31;49;1m[`date +%F' '%T`] Call Relation: bash${pid}\033[39;49;0m" | tee -a ${logFile} >&2
                                fi
                                if [ "${isExit}" -eq 1 ]; then
                                        if [ "${isExit}" -eq 1 ]; then
                                                if [ "${showMsgTestMode}" = "1" ]; then
                                                        return 1
                                                else
                                                        exit 1
                                                fi
                                        fi
                                fi
                        ;;
                        warning)
                                echo -e "\033[33;49;1m[`date +%F' '%T`] Warnning: ${showContent}\033[39;49;0m"  | tee -a ${logFile}
                                if [ "${isShowRelation}" -gt 1 ]; then  # 调用层次超过1次时才显示调用关系
                                        echo -e "\033[33;49;1m[`date +%F' '%T`] Call Relation: bash${pid}\033[39;49;0m"  | tee -a ${logFile}
                                fi
                        ;;
                        warning2)
                                echo -e "\033[33;49;1mWarnning: ${showContent}\033[39;49;0m"  | tee -a ${logFile}
                        ;;
                        msg)
                                echo "[`date +%F' '%T`] ${showContent}" | tee -a ${logFile}
                        ;;
                        msg2)
                                echo -n "[`date +%F' '%T`] ${showContent}" | tee -a ${logFile}
                        ;;
                        ok)
                                echo "OK" >> ${logFile}
                                echo -e "\033[32;49;1mOK\033[39;49;0m"
                        ;;
                        *)
                                echo -e "\033[31;49;1m[`date +%F' '%T`] Error: Call founction showMsg error\033[39;49;0m"  | tee -a ${logFile}
                                        if [ "${isExit}" -eq 1 ]; then
                                                if [ "${showMsgTestMode}" = "1" ]; then
                                                        return 1
                                                else
                                                        exit 1
                                                fi
                                        fi
                        ;;
                esac
        }
        #showMsgTestMode=1; logFile=/tmp/test.log
 
        #执行sql语句
        # executeSql "select now()"
        function executeSql()
        {
                local sql="$1"
                if [ -z "$mysqlUser" -o "$mysqlUser" = "" -o -z "${mysqlPwd}" -o "${mysqlPwd}" = "" ]; then
                        showMsg "errUserMsg" "mysql user or mysql password is not vaild."
                fi
                if [ "$sql" = "" ]
                then
                        showMsg "errUserMsg" "sql statement is null "
                else
                        echo -e "$sql" | mysql --defaults-extra-file=${my_cnf}  $useDBName --default-character-set=utf8 -N
                fi
        }
 
        #创建mycnf文件,供executeSql使用
        function createMycnfFile()
        {
                mysqlHost="$1"
                mysqlPort="$2"
                mysqlUser="$3"
                mysqlPwd="$4"
                #isIP=`echo "${mysqlHost}" | grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' | wc -l`
                if [ "${mysqlHost}" = 'localhost' ]; then
 
                        mysqlPid=`netstat -naltp | grep 'LISTEN' | awk   '$4~/'"$mysqlPort"'/{print $0}' | awk '{print $NF}' | awk -F'/' '{print $1}'`
                        mysqlSock=`netstat -nap | grep -w "${mysqlPid}/mysqld" | grep 'LISTENING' | grep -v 'mysqlx.sock' | awk '{print $NF}'`
                        echo -e "\n[client]\nhost=${mysqlHost}\nuser=${mysqlUser}\npassword='${mysqlPwd}'\nsocket=${mysqlSock}" > ${my_cnf}
                        echo -e "\n[mysqldump]\nhost=${mysqlHost}\nuser=${mysqlUser}\npassword='${mysqlPwd}'\nsocket=${mysqlSock}" >> ${my_cnf}
                else
                        echo -e "\n[client]\nhost=${mysqlHost}\nport=${mysqlPort}\nuser=${mysqlUser}\npassword='${mysqlPwd}'" > ${my_cnf}
                        echo -e "\n[mysqldump]\nhost=${mysqlHost}\nport=${mysqlPort}\nuser=${mysqlUser}\npassword='${mysqlPwd}'" >> ${my_cnf}
                fi
 
        }
############################################################# 功能函数 End ####################################################################
 
function shellInit()
{
        sid=`basename $0`
        export pid="${pid}-->$sid"
        theFiledir=`echo $(cd "$(dirname "$0")"; pwd)`
        cd ${theFiledir}
        #默认日志文件为“本文件名.log”,如main函数有传入logFile参数(如不带路径则为当前目录),则以传入的日志文件名为准
        theFileName=`basename $0 | awk -F"." '{print $1}'`
        if [ "${logFile}" = "" ]; then
                logFile="${theFileName}.log"
        fi
        logFilePath=`dirname ${logFile}`
        if [ "${logFilePath}" = '.' ]; then
                logFilePath=${theFiledir}
        fi
        logFileName=`basename ${logFile}`
        logFile="${logFilePath}/${logFileName}"
        mkdir -p ${logFilePath}
        touch ${logFile}
        shellPId="$$"
        my_cnf="/tmp/.my_${shellPId}.cnf"
        tmpFile="/tmp/.tmpFile.${shellPId}"
        tmpFile2="/tmp/.tmpFile2.${shellPId}"
        #退出/中止(包括导常退出)脚本时执行的命令
        trapCmd="rm -f /tmp/.my_${shellPId}.cnf"
        trapCmd="${trapCmd}; rm -f /tmp/.tmpFile.${shellPId}"
        trapCmd="${trapCmd}; rm -f /tmp/.tmpFile2.${shellPId}"
        trap 'eval ${trapCmd}' exit
        #输出执行方法
        showMsg 'msg'
        showMsg 'msg' "Run Shell: ${cmdShell} ${parameterString}"
        #--------以上为框架规定,建议不要做修改----------
        #执行Mysql的初始参数
        if [ "${mysqlHost}" = "" ]; then
                mysqlHost='localhost'
        fi
        createMycnfFile "${mysqlHost}" "${mysqlPort}" "${mysqlUser}" "${mysqlPwd}"
        ########################
        #执行Oracle的初始参数
        #oraUser=scott
        #oraPwd=tiger
}
 
function check()
{
        isRunBatchNum=`echo "${runBatch}" | grep -E -w '^[0-9]+$' | wc -l`
        if [ "${isRunBatchNum}" != "1" ]; then
                showMsg 'errUserMsg' "\${runBatch} only a number"
        fi
        executeSql "select 1" > /dev/null
        showMsg 'errSysMsg' "Can not connet to the MySQL(mysqlHost=${mysqlHost},mysqlPort=${mysqlPort},mysqlUser=${mysqlUser},DBName=${useDBName})"
}
 
 
# 创建一张表并插入测试数据
# 如果要修改表结构则修改此函数
function createOneTableTestData()
{
        local tableName="$1"
        local runBatch="$2"
        sql="
          create database if not exists ${useDBName};
          # 建测试表
          CREATE TABLE ${tableName} (
            id int NOT NULL AUTO_INCREMENT PRIMARY KEY comment '自增主键',
            dept tinyint not null comment '部门id',
            name varchar(30) comment '用户名称',
            create_time datetime not null comment '注册时间',
            last_login_time datetime comment '最后登录时间'
          ) comment '测试表';
          #手工插入第一条测试数据,后面根据此行数据作为基础进行插入
          insert into ${tableName} values(1,1,'user_1', now(), now());
        "
        showMsg 'msg2' "Create table ${useDBName}.${tableName}......"
        executeSql "${sql}"
        showMsg 'errSysMsg' "Some error occur when execute '${sql}'"
        showMsg 'OK'
 
        sql="set @i = 1;"
        # 循环拼接SQL
        for i in $(seq 1 ${runBatch}); do
          sql="${sql}
            insert into ${tableName}(id, dept, name, create_time, last_login_time)
            select @i:=@i+1,
              left(rand()*10,1) as dept,
              concat('user_',@i),
              date_add(create_time,interval + (${runBatch}-@i) * cast(rand()*10 as signed) SECOND),
              date_add(date_add(create_time,interval + (${runBatch} - @i) *cast(rand()*10 as signed) SECOND), interval + cast(rand()*1000000 as signed) SECOND)
            from ${tableName};
            "
        done
        showMsg 'msg2' "Create test data on ${useDBName}.${tableName}......"
        executeSql "${sql}"
        showMsg 'errSysMsg' "Some error occur when execute '${sql}'"
        showMsg 'OK'
        # 创建索引(视情况决定是否打开)
        #showMsg 'msg2' "Create index on ${tableName}......"
        #sql="
        #     #create index idx_dept on ${tableName}(dept);
        #     #create index idx_create_time on ${tableName}(create_time);
        #     #create index idx_last_login_time on ${tableName}(last_login_time);
        #    "
        #executeSql "${sql}"
        #showMsg 'errSysMsg' "Some error occur when execute '${sql}'"
        #showMsg 'OK'
        showMsg 'msg' ''
}
 
#使用说明
function usage()
{
        parameter="$1"
        myFileName=`basename $0`
        if [ "${parameter}" = '--help'  -o  "${parameter}" = '-h' -o "${runBatch}" = "" ]; then
                echo "Usage:  sh ${myFileName} \${mysqlHost} \${mysqlPort} \${mysqlUser} \${mysqlPwd} \${DBName} \${tableName} \${runBatch}"
                echo "Usage1: sh ${myFileName} localhost 3306 root '123456' 'test' 'testTable' 20              # 在test库中生成testTable表,记录数为104万+"
                echo "Usage2: sh ${myFileName} localhost 3306 root '123456' 'test' 'testTable_{1..10}' 20      # 在test库中生成testTable_1、testTable_2......testTable_10共10张表,每表表记录数为104万+"
                echo "Usage2: sh ${myFileName} localhost 3306 root '123456' 'test' 'testTable_{01..10}' 20     # 在test库中生成testTable_01、testTable_02......testTable_10共10张表,每表表记录数为104万+"
                echo "        注意:'testTable_{1..10}' 要用单引号引起来"
                echo ''
                echo 'runBatch是循环次数:'
                echo '------------------------------------'
                echo '        runBatch=15生成32768记录'
                echo '        runBatch=16生成65536记录'
                echo '        runBatch=17生成13万+记录'
                echo '        runBatch=18生成26万+记录'
                echo '        runBatch=19生成52万+记录'
                echo '        runBatch=20生成104万+记录'
                echo '        runBatch=21生成209万+记录'
                echo '        runBatch=22生成419万+记录'
                echo '        runBatch=23生成838万+记录'
                echo '        runBatch=24生成1677万+记录'
                echo '        runBatch=25生成3355万+记录'
                echo '        runBatch=26生成6710万+记录'
                echo '        runBatch=27生成1.3亿+记录'
                echo ''
                exit 1
        fi
}
 
function main()
{
        # 初始化变量
        mysqlHost="$1"   # mysql Host
        mysqlPort="$2"   # mysql端口
        mysqlUser="$3"   # mysql账号
        mysqlPwd="$4"    # mysql密码
        useDBName="$5"   # 测试表所在的库名
        tableName="$6"   # 测试表表名
        runBatch="$7"    # 循环次数 runBatch=20生成104万记录;23生成838万记录,24生成1677万记录,25生成3300万记录...
        logFile="$8"
        #取得执行参数
        cmdShell=`basename $0`
        for theParameter in "$@"
        do
            parameterString="${parameterString} '${theParameter}'"
        done
        #输出帮助
        usage "$1"
        shellInit
        check
        #tableName='t_test{1..100}'
        isMoreTable=`echo "${tableName}" | grep -E '\{[0-9]+\.\.[0-9]+}' | wc -l`
        if [ "${isMoreTable}" = 1 ]; then
                tableBaseName=`echo $tableName | awk -F"{" '{print $1}'`
                rangeBegin=`echo "${tableName}" | awk -F"{" '{print $NF}' | awk -F"." '{print $1}' `
                # 如果分表的序号以0开头,则按rangeBegin的位数进行0填充,例如testTable_{01..10},则生成的分表为testTable_01、testTable_02...testTable_10
                isZeroHead=`echo "${tableName}" | awk -F"{" '{print $NF}' | awk -F"." '{print $1}' | grep '^0' | wc -l`
                rangeBit=`echo ${#rangeBegin}`
                rangeEnd=`echo "${tableName}" | awk -F"{" '{print $NF}' | awk -F"." '{print $3}' | sed 's/}//g'`
                for i in `seq ${rangeBegin} ${rangeEnd}`; do
                        if [ "${isZeroHead}" = "1" ]; then
                                i=$(printf "%0${rangeBit}d" $i)
                        fi
                        tableTargetName="${tableBaseName}${i}"
                        createOneTableTestData "${tableTargetName}" "${runBatch}"
                done
        else
                createOneTableTestData "${tableName}" "${runBatch}"
        fi
}
main "$@"

 

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

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

相关文章

月入8000+的steam/csgo搬砖项目(详细拆解)

大家好,我是阿阳 今天就给大家带来一个在steam游戏搬砖项目的拆解,目前这个项目我们团队也一直在带队实操,已经跑通了项目的整个流程,提炼出了完整的赚钱体系。 先给大家看看近期的收益情况: 近期的出售记录&#xf…

[ Azure - Database ] Azure Database for MySQL 配置Auditing并查看使用

传统MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间。本文会讲解微软云Azure Database for MySQL的binlog相关…

i.MX8MP平台开发分享(IOMUX篇)- 硬件原理

专栏目录:专栏目录传送门 平台内核i.MX8MP5.15.71文章目录1.前言2.IOMUX原理3. 寄存器实例:UART1_RX3.1 PAD: UART1_RXD3.2 PAD: SD1_CMD3.3 PAD: SAI2_RXC3.4 Input select3.5 功能实现4.SION1.前言 我们都知道,芯片包含数量有限的引脚&am…

BeanFactory和Applicationcontext实现

1.容器接口 1.BeanFactory能做哪些事 1.什么是beanFactory 它是spring的核心容器 是ApplicationContext的父接口 ApplicationContext扩展实现都【组合了】beanFactory 2.BeanFactory的功能 明面上只有getBean()方法实际上控制反转、依赖注入、bean生命周期的各种功能都…

tslib-1.4在I.MX6ULL开发板上电容屏不能触摸问题

一、前言 在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能&#x…

ESP32-S3 >>> MicroPython 编程初探

今天买了一个ESP32-S3,打算试试在这上面进行MicroPython的编程(附资料网址)。 首先为了在ESP32上进行mp的编程,需要对其重新烧录固件。这就需要我们电脑安装好CH343驱动,然后找到适用于ESP32-S3的固件,利用…

Diffusion详解及PyTorch代码

首先附上几个大佬的讲解 lilianweng-diffusion-models 这篇博客借鉴了上述博客和视频,同时加上个人的理解整合了一下,整个推导过程非常详细,希望能使每个人都看懂 结合之前讲过的VAE和GAN模型,Diffusion Model和他们的区别就是…

Apache Struts2远程代码执行漏洞(S2-015)复现及修复方案

Apache Struts2远程代码执行漏洞(S2-015)介绍 Apache Struts 2是用于开发JavaEE Web应用程序的开源Web应用框架。Apache Struts 2.0.0至2.3.14.2版本中存在远程命令执行漏洞。远程攻击者可借助带有‘${}’和‘%{}’序列值(可导致判断OGNL代码两次)的请求…

LabVIEW​​共享​变量生命周期

LabVIEW​​共享​变量生命周期 共享​变量​生命​周期 ​所有​共享​变量​都是​项目​库​的​一部分。​SVE​将会​注册​项目​库​和​库​中​包含​的​共享​变量​(当​LabVIEW​需要​调​用​其中​某​个​变量​时)​。​默认​情况​…

AlphaGo简易版MuGo源码解析

文章目录前言源码实现MuGo的输入数据模型的搭建模型的训练参考链接结语前言 自从AlphaGo横空出世,战胜李世石后,AI围棋如雨后春笋一般遍地开花。阅读DeepMind的论文有时还是隔靴搔痒,只有钻到代码里,才能一探究竟。于是&#xff…

Arthas诊断追踪性能案例

文章目录1、什么是Arthas2、安装启动3、追踪流程背景:本次案例使用Windows操作系统进行本地环境演示(生产环境Linux同理) 案例:查询接口性能特别慢,通过Arthas追踪诊断链路中哪个步骤导致性能如此之慢 注意&#xff1a…

code review的思考和实践

使用方式 1.看名称效果图,有没有和自己想要的效果类似的 2.有的话,复制粘贴代码使用 3.也可以自己修改一下 4.css效果并不是特别难,只是有时候我们可能想不到 5.笔者空闲时间,会继续更新的哦,点赞关注不迷路**^_^** …

EMNLP 22:SetGNER: General Named Entity Recognition as Entity Set Generation

SetGNER: General Named Entity Recognition as Entity Set Generation **任务形式:**识别flat、nest和不连续实体。 **任务建模方式:**采用基于pointer的方式实现任务建模,文本序列中的每个word可以用tag表示,具体为&#xff1…

Java算法_LeetCode122:买卖股票的最佳时机II

LeetCode122:买卖股票的最佳时机II 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 …

有关于huggingface evaluate的使用

老版本Transformer的from datasets import load_metric,在新版本中被替换成了evaluate。 这个包挺难用的,而且不同版本的接口都有点不太一样,本博客以transformers4.18.0, evaluate0.4.0为例,示范一下如何使用evaluate进行常见的…

【LDF】线性判别函数(一)

基于判别函数的判别准则 对于ccc类分类问题:设 gi(x),i1,2,…,cg_i(\mathbf{x}), i1,2, \ldots, cgi​(x),i1,2,…,c, 表示每个类别对应的判别函数,决策规则为:如果 gi(x)>gj(x),∀j≠ig_i(\mathbf{x})>g_j(\mathbf{x}), \forall j \n…

[机器学习-概念新] 什么是欧式距离、标准化欧式距离、马氏距离、余弦距离

1.欧式距离(Euclidean Distance) 欧式距离源自N维欧氏空间中两点间的距离公式: 代码实践 from scipy import spatial vec1 [1, 2, 3, 4] vec2 [5, 6, 7, 8] euclidean spatial.distance.euclidean(vec1, vec2) print(euclidean) 2.标准化欧式距离(S…

狂揽两千星,速度百倍提升,高性能Python编译器Codon开源

这个高性能 Python 编译器具有支持 Python 众多语法、完美互通其他框架等优点。 众所周知,Python 是一门简单易学、具有强大功能的编程语言,在各种用户使用统计榜单中总是名列前茅。相应地,围绕 Python,研究者开发了各种便捷工具&…

G1垃圾回收

目录一、G1垃圾回收器G1垃圾回收阶段(3个)① Young Collection② Young Collection CM③ Mixed CollectionYoung Collection 跨代引用RemarkG1—垃圾回收器优化字符串去重类卸载巨型对象动态调整阈值一、G1垃圾回收器 定义: Garbage First&…

lanmp环境搭建,你需要一次独立安装来深入了解各个软件

一,安装Apache yum install httpd -y,安装apache,版本为2.4.6,最新为2.4.9。 cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak; vim /etc/httpd/conf/httpd.conf (默认唯一) 端口改为8000,不能与Ngin…