Youzi - Youzi
type: channel
link: https://www.autisn.com/index.php/author/1/
description: Youzi
items: Linux常用命令
items: 线程池的初步使用
items: 在实体类里定义一个数据库不存在的字段
items: JVM初认识
items: Nginx的简单使用
items: Thymeleaf的简单使用
items: ElasticSearch在SpringBoot中的简单运用
items: Fegin的调用流程
items: Vue父子组件传值
items: 网站迁移步骤

Linux常用命令
type: item
date: 2026-06-01T23:38:59+08:00
description: #压缩成bz2文件,demo.txt.bz2 bzip2 demo.txt #解压缩bz2文件,demo.txt bunzip2 demo.txt.bz2 #压缩成gz文件,demo.txt.gz gzip demo.txt #解压缩bz2文件,demo.txt gunzip demo.txt.gz #压缩成rar文件,package(首先要安装rar命令才行) rar a package #解压缩bz2文件,package.rar rar x package #把package文件压缩到demo.bz2里面 tar -jcvf demo.bz2 package #查看demo.tar文件 tar -tf demo.bz2 #解压demo.bz2文件 tar -jxvf demo.bz2 #把package文件压缩到demo.tar.gz里面 tar -zcvf demo.tar.bz2 package #解压demo.tar.gz文件 tar -zxvf demo.tar.gz #删除文件 rm -f demo.txt #删除文件夹 rmdir package

线程池的初步使用
type: item
date: 2025-08-09T23:19:25+08:00
description: import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; public class ThreadPoolAllDoneCheck { public static void main(String[] args) { // 创建固定大小线程池 ExecutorService executor = Executors.newFixedThreadPool(5); // 存放 Future 结果 List<Future<Boolean>> futures = new ArrayList<>(); try { // 提交多个任务 for (int i = 0; i < 10; i++) { futures.add(executor.submit(() -> yourTask())); } // 等所有线程执行完成后，再统一判断结果 boolean hasFalse = false; for (Future<Boolean> future : futures) { try { Boolean result = future.get(); // 阻塞直到任务完成 if (!result) { hasFalse = true; } } catch (ExecutionException e) { // 捕获任务内部抛出的异常 e.printStackTrace(); hasFalse = true; // 认为失败 } } // 所有线程都完成后再判断 if (hasFalse) { throw new RuntimeException("存在任务执行结果为 false！"); } System.out.println("全部任务执行成功！"); } catch (InterruptedException e) { e.printStackTrace(); } finally { executor.shutdown(); } } // 模拟你的业务方法 public static boolean yourTask() throws InterruptedException { Thread.sleep(500); // 模拟耗时 boolean result = Math.random() > 0.2; // 80% 概率返回 true System.out.println(Thread.currentThread().getName() + " 执行任务，结果: " + result); return result; } }

在实体类里定义一个数据库不存在的字段
type: item
date: 2024-04-30T23:34:53+08:00
description: 1、在mybatis中定义不存在字段//引入 import org.springframework.data.annotation.Transient; //使用 @Transient private List<AwardGuidelineFile> awardGuidelineFileList;2、在jpa项目中定义不存在字段//引入包 import javax.persistence.Transient; //使用 @Transient protected FsCatalog bsParent;3、在mybatis-plus中定义不存在字段@TableField（exist = "false"） private String name;

JVM初认识
type: item
date: 2023-10-24T15:35:05+08:00
description: 1、jvm 内存模型程序计数器 Program Counter Register：记录的是正在执行的虚拟机字节码指令的地址。此内存区域是唯一一个在JAVA虚拟机规范中没有规定任何OutOfMemoryError的区域虚拟机：VM Stack描述的是 JAVA 方法执行的内存模型，每个方法在执行的时候都会创建一个栈帧， 用于存储局部变量表，操作数栈，动态链接，方法接口等信息局部变量表存储了编译期可知的各种基本数据类型、对象引用线程请求的栈深度不够会报 StackOverflowError 异常栈动态扩展的容量不够会报 OutOfMemoryError 异常虚拟机栈是线程隔离的，即每个线程都有自己独立的虚拟机栈本地方法：Native Stack本地方法栈类似于虚拟机栈，只不过本地方法栈使用的是本地方法堆：Heap几乎所有的对象实例都在堆上分配内存2、堆所有的对象实例以及数组都要在堆上分配。堆是垃圾收集器管理的主要区域，也被称为“GC 堆”；也是我们优化最多考虑的地方。 堆可以细分为：1.新生代Eden 空间From Survivor 空间To Survivor 空间2.老年代3.永久代/元空间Java8 以前永久代，受 jvm 管理，java8 以后元空间，直接使用物理内存。因此， 默认情况下，元空间的大小仅受本地内存限制。 垃圾回收从 Java8 开始，HotSpot 已经完全将永久代（Permanent Generation）移除，取而代之的是一 个新的区域—元空间（MetaSpace）3、运行图由于FGC的速度比YGC的速度慢得多，所以JVM的优化也是尽量避免FGC

Nginx的简单使用
type: item
date: 2023-10-24T11:01:00+08:00
description: 1.Docker安装Nginx并启动#没有安装的情况下会自动安装，可以指定版本 docker run -p 80:80 --name nginx -d nginx:1.10 #将容器内的配置文件拷贝到当前目录 #别忘了后面的点 docker container cp nginx:/etc/nginx . #修改文件名称并把这个 conf 移动到/mydata/nginx 下 mv nginx conf #终止原容器 docker stop nginx #执行命令删除原容器 docker rm nginx #创建新的 nginx；执行以下命令 docker run -p 80:80 --name nginx \ -v /mydata/nginx/html:/usr/share/nginx/html \ -v /mydata/nginx/logs:/var/log/nginx \ -v /mydata/nginx/conf:/etc/nginx \ -d nginx:1.10 #给 nginx 的 html 下面放的所有资源可以直接访问 drwxr-xr-x. 3 root root 34 Oct 17 07:49 html2.搭建域名访问要求是 ： 访问gulimall.com 能访问到我们自己本机idea中启动的product服务思路：我们通过配置本地的host域名映射我们虚拟机的中的nginx，然后nginx在根据转发规把请求转发回我们自己的idea中的本地服务。前置说明：因为我们的nginx的安装在云服务器上的，本地Host文件解析域名后访问云服务器, 结果请求被拦截虽然可以用谷歌浏览器安装ModHeader插件解决，但是我们在把请求映射到nginx后，在让nginx转发回我们本地的服务是无法完成的，因为云服务器无法ping通我们本地的ip 原因 本地pc属于移动宽带的内网环境，说白了就是cmd下ipconfig里的ip是你电脑宽带运营商的一个大网络（外网）下的一个内网ip，服务器无法主动与内网ip建立连接，连路由都做不到。所以不可能ping通的。可以考虑使用VPN在您的电脑和服务器之间建立VPN连接，这样服务器和您的电脑就能像在同一个内网一样互相访问了2.1配置本地host可以利用SwitchHost配置工具。需要注意的是这个软件要用管理员打开，然后C:\Windows\System32\drivers\etc把hosts的文件权限放开，才能进行修改如下图配置，前面是虚拟机的地址，后面是需要解析的域名2.2配置nginx# 查看我们nginx的总配置文件 [root@ecs-284198 conf]# cat /mydata/nginx/conf/nginx.conf user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; } [root@ecs-284198 conf]# # 当前总文件的最后一行 include /etc/nginx/conf.d/*.conf; 他会加载这个路径下的所有以 .conf结尾的文件作为配置文件，并且在包含到我们的当前的总配置文件中，这样就不会导致一个配置文件很大，所以接下来我们到 conf.d 的目录下新建一个gulimall.conf文件 # cd 到 /mydata/nginx/conf/conf.d/会有一个default.conf，然后我们复制一个default.conf为gulimall.conf [root@ecs-284198 conf.d]# cd /mydata/nginx/conf/conf.d/ [root@ecs-28…

Thymeleaf的简单使用
type: item
date: 2023-10-24T10:10:45+08:00
description: 1.引入jar包 org.springframework.boot spring-boot-starter-thymeleaf 2.后端代码package com.atguigu.gulimall.product.web; import com.atguigu.gulimall.product.entity.CategoryEntity; import com.atguigu.gulimall.product.service.CategoryService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; import java.util.Map; @Controller public class IndexController { @Autowired CategoryService categoryService; @GetMapping({"/", "/index.html"}) public String indexPage(Model model) { //1.查出所有的一级分类 List<CategoryEntity> categoryEntities = categoryService.getLevel1Categorys(); model.addAttribute("categorys", categoryEntities); //视图解析器进行拼串 //"classpath:/templates/" +返回值+ ".html" return "index"; } }3.在resource下新建templates文件夹（页面都放进这里面） 谷粒商城2020 X 家用电器 Hi, 欢迎来到! 登录 注册 新人福利 PLUS会员 促销 公告 更多 全民纸巾大作战 家具建材满999减300元 黑科技冰箱，下单立减千元 抢102减101神券！ 关于召回普利司通（天津）轮胎有限公司2个规格乘用车轮胎的公告 物流推出配送员统一外呼电话"95056” 天府大件运营中心开仓公告 大件物流“送装一体”服务全面升级！ 话费 机票 酒店 游戏 企业购 加油卡 电影票 火车票 众筹 理财 礼品卡 白条 话费 机票 酒店 游戏 X 话费充值 流量充值 套餐变更 号码 面值 100元 20元 50元 10元 2元 ￥98.0-￥100.0 快速充值 抢99减50元话费 X 国际机票 国际/港澳 特惠活动 单程 往返 机票查询 当季热门特惠机票 X 国内港澳台 促销活动 酒店查询 订酒店到 X 点卡 QQ 页游 面值 面值 面值 面值 ￥0.00 直充 卡密 快速充值 吃鸡就要快人一步 4.简单语法示例，更多语法参考官网https://www.thymeleaf.org/doc/tutorials/3.1/usingthymeleaf.html Welcome to our grocery store! 5.修改Thymeleaf的文件后能及时在页面更新，则要关闭缓存spring: thymeleaf: cache: false6.如果resource下的static文件读取不到时，可以加入以下配置或者在pom文件中加入spring: mvc: static-path-pattern: /static/**或者在pom文件中加入以下配置 false src/main/resources **/*.properties **/*.xml **/*.yml static/**

ElasticSearch在SpringBoot中的简单运用
type: item
date: 2023-10-23T22:33:00+08:00
description: 1.给es中建立索引。product,建立好映射关系PUT product { "mappings": { "properties": { "skuId": { "type": "long" }, "spuId": { "type": "long" }, "skuTitle": { "type": "text", "analyzer": "ik_smart" }, "skuPrice": { "type": "keyword" }, "skuImg": { "type": "keyword", "index": false, "doc_values": false }, "saleCount": { "type": "long" }, "hosStock": { "type": "boolean" }, "hotScore": { "type": "long" }, "brandId": { "type": "long" }, "catelogId": { "type": "long" }, "brandName": { "type": "keyword", "index": false, "doc_values": false }, "brandImg": { "type": "keyword", "index": false, "doc_values": false }, "catelogName": { "type": "keyword", "index": false, "doc_values": false }, "attrs": { "type": "nested", "properties": { "attrId": { "type": "long" }, "attrName": { "type": "keyword", "index": false, "doc_values": false }, "attrValue": { "type": "keyword" } } } } } }2.Service类package com.atguigu.gulimall.lsearch.service; import com.atguigu.common.to.es.SkuEsModel; import java.io.IOException; import java.util.List; public interface ProductSaveService { boolean productStatusUp(List<SkuEsModel> skuEsModels) throws IOException; }3.ServiceImpl类package com.atguigu.gulimall.lsearch.service.iml; import com.alibaba.fastjson.JSON; import com.atguigu.common.to.es.SkuEsModel; import com.atguigu.gulimall.lsearch.config.GulimallElasticSearchConfig; import com.atguigu.gulimall.lsearch.constant.EsConstant; import com.atguigu.gulimall.lsearch.service.ProductSaveService; import lombok.extern.slf4j.Slf4j; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.xcontent.XContentType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @Slf4j @Service("pro…

Fegin的调用流程
type: item
date: 2023-10-23T22:22:00+08:00
description: //Fegin的调用流程 /** 1.构造请求数据，将对象转为JSON * RequestTemplate template = buildTemplateFromArgs,create(argv); * 2.发送请求进行执行《执行成功会解码响应数据): * executeAndDecode(template); * 3.执行请求会有重试机制 * while(true){ * try{ * executeAndDecode(template); * }catch(){ * try{retryer.continueOrpropagate(e);}catch()fthrow ex;) * continue; * } * * } */ //位于ReflectiveFeign.class public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (!"equals".equals(method.getName())) { //判断如果是hashCode或是toString方法就不需要远程调用 if ("hashCode".equals(method.getName())) { return this.hashCode(); } else { //这里是个三元运算符 return "toString".equals(method.getName()) ? this.toString() : //这里才是真正的远程调用，接下来步入这个方法 ((MethodHandler)this.dispatch.get(method)).invoke(args); } ... } //SynchronousMethodHandler.class 代码演示 public Object invoke(Object[] argv) throws Throwable { //请求模板，包含请求路径、请求方式、请求体等信息 //默认构造的模板是不包含请求头和请求参数的 RequestTemplate template = this.buildTemplateFromArgs.create(argv); Options options = this.findOptions(argv); //这是一个重试器，Feign组件默认使用Ribbon的重试机制并增加了根据状态码判断重试机制。默认是关闭的。 Retryer retryer = this.retryer.clone(); while(true) { try { //真正的执行方法在这 return this.executeAndDecode(template, options); } catch (RetryableException var9) { RetryableException e = var9; try { retryer.continueOrPropagate(e); } catch (RetryableException var8) { Throwable cause = var8.getCause(); if (this.propagationPolicy == ExceptionPropagationPolicy.UNWRAP && cause != null) { throw cause; } throw var8; } if (this.logLevel != Level.NONE) { this.logger.logRetry(this.metadata.configKey(), this.logLevel); } } } }

Vue父子组件传值
type: item
date: 2023-10-01T14:45:28+08:00
description: 子页面 父页面 总结：父子组件传递数据子组件给父组件传递数据，事件机制；子组件给父组件发送一个事件，携带上数据。this.$emit("事件名",携带的数据...)

网站迁移步骤
type: item
date: 2023-08-24T11:47:00+08:00
description: 1.安装和原服务器一样的环境1.1我用的是CentOS 系统，首先安装系统环境1.2我使用的是宝塔面板，所以宝塔面板也要安装一致（版本不一致也可以用，不过最好用的是一样的，避免出现未知原因引起的错误）2.迁移前做好备案准备分两种情况在同一个服务器厂商的情况下，只需要把网站的文件迁移到新的服务器（网站文件的路径要和旧服务器的一致）。在不同的服务器厂商的情况下，首先要先进行网站的备案，大概七个工作日，所以不要等到旧服务器快要过期才迁移，这样会导致时间上的不充裕，在迁移过程中会使网站暂停运行，剩下的就是把文件从旧服务器上的文件上传到新的服务器（路径要一致）。3.数据库的迁移在旧服务器上怎么安装的数据库，在新服务器上就怎么安装，最好就是版本都是一样的，然后导出旧数据上的表结构和数据，然后在新服务器上导入，要注意的就是数据库名称和密码要和旧数据库的要一致，这样就方便在新的服务器上运行的时候，不用重新修改代码。4.迁移完成迁移结束后，域名解析要换成新服务器的公网IP，会有缓存，并不是一修改好就马上解析上去的，24-72小时内，所以解析成功后要记得有空看看你的网站能否正常运行。PS1.迁移工具在宝塔面板有一个这个工具，我测试了一下，也是可以迁移成功的2.迁移时图床出现的问题我在迁移过程中是没有发现什么问题，主要是我自己的两个图床工具突然就是上传失败了，完全不能用，报错信息是Call to undefined function think\finfo open()，主要是php中的一个拓展没有安装。2.1找到这个2.2在设置里找到fileinfo并安装2.3重新测试