IT七剑客 IT七剑客
首页
wresource
郭霖
孤寒者
IT邦德
沉默王二
老麦
stackoverflow
GitHub (opens new window)
首页
wresource
郭霖
孤寒者
IT邦德
沉默王二
老麦
stackoverflow
GitHub (opens new window)
  • Java基础语法

  • 程序人生

  • 实用工具

  • Java重要知识点

  • Java工具

    • currentTimeMillis 统计耗时了,太 Low,试试 Spring Boot 源码在用的 StopWatch吧,够优雅!
    • WindTerm:新一代开源免费的终端工具,GitHub星标6.6k+,太酷了!
    • 在IDEA里下个五子棋不过分吧?
    • 好用到爆!GitHub 星标 32.5k+的命令行软件管理神器,功能真心强大!
    • 我们公司使用了6年的Spring Boot项目部署方案,打包 + 一键部署,稳的一批
    • 再见 Spring Task,这款老而弥坚的开源任务调度框架,用起来够优雅!
    • 解放双手!推荐一款 GitHub 星标 8.2k+的命令行软件管理器,非常酷炫!
    • 再见收费的TeamViewer,推荐一款不限速的国产远程控制软件
    • 几行代码,网站图片访问速度 100ms 飙升到 20ms!
    • 某意大利小哥,竟靠一个缓存中间件直接封神?
    • WindTerm:新一代开源免费的终端工具,GitHub星标6.6k+,太酷了!
    • 厉害!我带的实习生仅用四步就整合好SpringSecurity+JWT实现登录认证!
    • 保姆级SpringBoot+Vue图片上传到阿里云OSS教程
    • 两天两夜,1M图片优化到100kb!
    • 干掉Session?这个跨域认证解决方案真的优雅!
    • 前后端分离项目,如何解决跨域问题?
    • Spring Boot AOP 扫盲,实现接口访问的统一日志记录
    • 再见收费的Navicat!操作所有数据库就靠它了!
    • 取代 Mybatis Generator,这款代码生成神器配置更简单,开发效率更高!
    • 再见丑陋的 SwaggerUI,这款开源的API文档生成神器界面更炫酷,逼格更高!
  • 数组与字符串

  • 沉默王二 Java
  • Java工具
沉默王二
2022-09-01

几行代码,网站图片访问速度 100ms 飙升到 20ms!

大家好,我是二哥!

很早之前,就有小伙伴给我反馈说《Java 程序员进阶之路》经常有图片不显示或者加载缓慢。

img

但由于白嫖(GitHub图床+jsdelivr CDN)的力量实在是太过强大了(狗头),再加上我本人没有遇到过这个问题,所以就一直拖延着,迟迟没有行动。

直到某一天,我神秘的流量用光了,上不去了谷歌,访问不了 X 网,我才发现,原来我的网站加载图片这样慢啊!!!!经常是一蹦一蹦出来的,肉眼(带近视镜)可见的慢。

img

事没到自己头上,显然高高挂起,可一旦事搁到自己头上,就受不了了呀!

于是我打开站长工具检测了一下图片的访问速度,好家伙,我直接好家伙!国内的访问速度能飙到 100ms,国外的确实快,只有 14.7ms,

img

要知道,网站面对的用户群体大多数都是国内的小伙伴,这速度,真的是劝退用户!

再加上我今天看到小林把自己的网站也升级了自己的图床,所以我就也按捺不住了。

怎么办?

不可能一个个手动替换啊,《Java 程序员进阶之路》上少说也有 200 篇文章,一篇文章平均 5 张图片的话,也得 1000 张吧,全部替换下来还不得疯!

由于我本地已经分门别类的保存了所有的图片,就只剩下:

  • 第一步,把图片上传到某云厂商
  • 第二步,批量替换所有文章中的图片链接为新图床的地址

替换链接的思路也比较简单,就是读取所有 md 文件,找到其中的图片地址,按照下图的方式替换即可。

img

第一步,上传图库到云厂商

直接选择扫描文件夹就可以把所有的图片上传到新的图床里。

img

img

PS:这里有个坑,不知道有眼尖的小伙伴看出来了没?

第二步,开启 CDN

只使用 OSS 的话,除了流量计费比较高一点外,就是图片没有进行加速服务,所以我就顺带开启了 CDN 服务。开启方法非常简单,只需要将域名回源到 OSS 就可以了。

img

第三步,编写 Java 代码批量转链

@Slf4j
public class ConvertAllFileWithPool {
    public static final String img_url_pre_before = "https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/";
    private final static String img_url_pre_after = "http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/images/";
    private final static String docPath = "/Users/maweiqing/Documents/GitHub/toBeBetterJavaer/docs/";

    public static void main(String[] args) throws IOException {
        // 递归遍历目录以及子目录中的所有文件
        List<File> files = FileUtil.loopFiles(docPath);
        log.info("总文件数{}",files.size());

        ExecutorService executorService = Executors.newCachedThreadPool();
        for (File file: files) {
            if (FileNameUtil.isType(file.getName(), "md")) {
                log.info("MD 文件{}", file.getName());
                executorService.submit(() -> {
                    FileReader fileReader = FileReader.create(file, Charset.forName("utf-8"));
                    String result = fileReader.readString().replaceAll(img_url_pre_before,img_url_pre_after);
                    log.info("转换完毕");
                    try {
                        FileWriter writer = new FileWriter(file);
                        writer.write(result);
                        writer.flush();
                    } catch (IOException e) {
                        log.error("写入文件出错了{}", e);
                    }
                });
            }
        }
    }
}
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

(屏幕前的你:二哥,你管这叫几行代码?信不信我锤死你!)加粗加粗

思路非常简单,也没有多少行代码:

  • 通过 hutool 的 FileUtil.loopFiles() 方法递归遍历目录以及子目录中的所有文件;
  • 通过 Executors.newCachedThreadPool() 创建一个缓存线程池,由于最多 1087 个文件,所以不用担心线程池资源耗尽;也就不用严格按照阿里手册上强制要求的不能使用 Executors 创建线程池,因地制宜;
  • 循环遍历所有文件,通过 FileNameUtil.isType() 过滤掉不是 md 的文件;
  • 通过 FileReader 读取文件内容,并通过 String 类的 replaceAll() 方法替换原有的图片链接;
  • 通过 FileWriter 重新写入文件;

来看一下执行日志:

17:29:30.547 [main] INFO top.image.ConvertAllFileWithPool - 总文件数1087
。。。
17:29:30.649 [main] INFO top.image.ConvertAllFileWithPool - MD 文件flow-control.md
17:29:30.649 [pool-1-thread-12] INFO top.image.ConvertAllFileWithPool - 转换完毕
17:29:30.649 [pool-1-thread-4] INFO top.image.ConvertAllFileWithPool - 转换完毕
17:29:30.649 [pool-1-thread-8] INFO top.image.ConvertAllFileWithPool - 转换完毕
17:29:30.649 [pool-1-thread-5] INFO top.image.ConvertAllFileWithPool - 转换完毕
复制代码
1
2
3
4
5
6
7
8

基本上不到一秒钟就完成了,因为有 GitHub 作为版本仓库,所以我们可以放心大胆地执行,不用担心出错,大不了重来就是了。

img

大概检查几个文件后,发现 OK,就可以把修改后的文件提交到版本库了。

重新部署网站后,打开站长工具重新测试了一下图片的访问速度,这次就快多了,国内基本上都是在 20ms 左右,这比原来的 100ms 快了五分之四啊!

img

早知道这样子,我就早切换链接了!

小插曲

本地图片上传 OSS 的时候一点没注意,多了一个 images 的目录,就导致我构建网站后,发现图片全部挂了!

img

人慌了好一阵子,OSS 也没提供移动资源的功能,索性就只能在 md 文件中多加了一个 images 目录,这下只能将错就错了。

充了 100 块钱,不知道能用多久,OSS+CDN,链接中没敢用 HTTPS,因为 HTTPS 也收费,就先用 HTTP 了。

img

好了,今天是劳动节后第一天上班(昨天全员核酸),大早上起来我就在星球里制定了五月份的学习计划,不少球友都响应了,也制订了自己的学习计划。

img

药卷一起卷(狗头)


强烈推荐一波 GitHub 上星标 2k+ star 的开源专栏《Java 程序员进阶之路》,据说每一个优秀的 Java 程序员都喜欢她,风趣幽默、通俗易懂。内容包括 Java 基础、Java 并发编程、Java 虚拟机、Java 企业级开发、Java 面试等核心知识点。学 Java,就认准 Java 程序员进阶之路😄。

github.com/itwanger/to… (opens new window)

star 了这个仓库就等于你拥有了成为了一名优秀 Java 工程师的潜力。

没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟。

img

作者:沉默王二 链接:https://juejin.cn/post/7094533304220647455 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

编辑 (opens new window)
#Java#沉默王二
上次更新: 2023/01/30, 02:04:53
再见收费的TeamViewer,推荐一款不限速的国产远程控制软件
某意大利小哥,竟靠一个缓存中间件直接封神?

← 再见收费的TeamViewer,推荐一款不限速的国产远程控制软件 某意大利小哥,竟靠一个缓存中间件直接封神?→

最近更新
01
Coding 102 Writing code other people can read
02-26
02
Kotlin Flow响应式编程,StateFlow和SharedFlow
02-05
03
Kotlin Flow响应式编程,操作符函数进阶
02-05
更多文章>
Theme by Vdoing | Copyright © 2022-2023 IT七剑客 | MIT License
  • 闽ICP备2021006579号-4
  • 闽公网安备 35012102500470号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式