本文是连续更新系列,根据《任霏博客网站程序2020年度大更新》分为网络地域选择、云服务器配置优化、环境搭建优化(JVM)、缓存策略优化、SpringBoot配置优化、前端页面优化等方面分别讨论。
注:本文只根据我的个人经验分享,并非专业测评,部分内容不够专业还请谅解。
上一篇写完了服务器的购买和配置,这篇就写一下SpringBoot的优化与技术选型,选用了效率更高的Freemarker,增加了Redis缓存,增加了性能统计,增加了Github的Actions Workflows。
前端引擎选用Freemarker放弃Thymeleaf
在之前的版本里,我都使用的是Thymeleaf作为我的前端视图引擎,它能很好的保留html静态文件特征,使得可以直接打开html静态文件,可以和java代码解耦合,但是!截止到我发文时间,Thymeleaf这帮憨憨已经4年没有更新了,见下方截图,而且执行效率给我的感觉总是很慢,感觉不是秒开。我又去Freemarker那边看了看,见下方继续说。

Freemarker的更新频率见下方截图,虽然不能说每天都有更新,但最少可以看出是有人在管理和更新的,而且我尝试了一下对比Freemarker和Thymeleaf的执行效率,我感觉Freemarker几乎是秒开页面,而且在网络上搜索了一些资料发现使用Freemarker的人更多,所以我选择了执行效率更高的Freemarker作为我的前端引擎。

使用Redis缓存
说到使用缓存,我还得先说场景问题,因为并不是所有地方都适用缓存,抛开使用场景直接就加缓存的都是耍流氓。
本次更新的重点是提升页面打开速度,在使用缓存方面就需要先分析一下我自己的使用场景,我的个人网站博客基本都是查询操作,没有繁重的业务逻辑,也不需要事务的支持,唯一在更新的就是文章浏览量,但这个数值并不需要准确和实时的时效,加缓存完全可接受。磁盘IO跟内存比是很慢的,所以不如直接将热数据加载到内存中,随时取用。
然后就是缓存的选择,最早我使用过Memcache,后来开始流行Redis,虽然它们都是将数据存储在内存中,但Redis更多的数据类型,Redis还可以定期将数据写回数据库,而且Redis可以定期保存到磁盘(持久化),数据丢失后可以通过aof恢复,而Memcache遇到意外的话,数据就没有了。然后对比流行的程度和SpringBoot的支持,我选择了更流行的Redis作为我的缓存数据库。
关于缓存的时间,每个人都有自己的想法,因为每个人遇到的流量也不一样,访问量小时间短的话起不到缓存的意义,如果缓存时间太长又担心变化的数据不能及时更新,比如浏览量和评论数据等等,我目前使用的缓存时间是2个小时,因为根据我的网站流量,基本每个小时肯定会有人访问,经过折中决定使用两个小时作为我的缓存时间。
增加性能统计
有的同学可能关注到,在我的网站页面右下角,会显示一行字,例如”Processed in 0.001055 second(s), calls 6 methods.“,这是通过Spring的AOP面向切面统计的时间,在后台可以打印出调用了多少个方法,每个方法执行的耗时,这样可以快速定位到是哪个方法出了问题,对性能低下的方法进行优化,本篇只讲后端的内容,前端的性能优化和评测在后面连续更新中再写。

使用Github的Actions Workflows
说到网站页面右下角,可能还有同学注意到这样一行字”Ver: 1.0.24 Build: 20201206143526“,本次更新主要优化效率,而每次更新打包部署,也非常耗费时间和精力的,正巧发现了Github的Actions Workflows,这个是Github的类似CD/CI的自动化工作流,这个Github还是非常厚道的,之前我使用Travis-CI速度非常慢,而Github提供的Actions性能非常高,似乎没有保留和限速,编译速度杠杠的,所以在这里推荐一下Github的Actions Workflows。
利用Github的Actions,在每次发布版本的时候触发工作流,自动执行编译、打包、上传Docker镜像,所以页面下方会有当前的版本和编译时间戳。
