程序员必备小知识系列--个人网站功能开发与性能优化经历(5)其他优化

13,286 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

自己搭建了一个基于SpringBoot+Spring Security+MyBatis+MySQL+Redis+Thymeleaf的博客网站。上线个人云服务器后,发现服务器访问慢。个人服务器是1核2G的,1M宽带,虽然服务器是低配的,但是可以通过优化代码,中间件等手段,来提升性能。我会讲解个人网站功能的开发与一些性能优化的经历。

这篇主要讲其他方面的优化

一、服务器优化

GZIP(GNU- ZIP)是一种压缩技术。经过GZIP压缩后页面大小可以变为原来的30%甚至更小,这样,用户浏览页面的时候速度会块得多。GZIP数据压缩可以对前端的静态资源,服务器资源等进行压缩,压缩之后,访问速度会增快,在nginx的http模块进行配置

#gzip  on;
# 开启Gzip
gzip on;
# 压缩临界值,大于1K的才压缩,一般不用改
gzip_min_length 1k;
# 设置gzip申请内存的大小,其作用是按块大小的倍数申请内存空间
gzip_buffers 4 16k;
# 用于识别http协议的版本,早期的浏览器不支持gzip压缩,用户会看到乱码,所以为了支持前期版本加了此选项,目前此项基本可以忽略
#gzip_http_version 1.0;
# 设置gzip压缩等级,等级越底压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大
gzip_comp_level 2;
# 设置需要压缩的MIME类型,非设置值不进行压缩
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
# 跟Squid等缓存服务有关,on的话会在Header里增加"Vary: Accept-Encoding"
gzip_vary off;
# IE6对Gzip不怎么友好,禁止对它Gzip了
gzip_disable "MSIE [1-6]\.";

二、代码优化

经过之前的优化经验,比如减少与数据库的交互,那么,同样的,在系统中用到redis,也可以同样减少与redis的交互 之前的代码

/**
 * 获得redis中的文章内容
 */
public Object getArticleOnRedis(String key, Object field) {
    boolean articleExist = hashRedisServiceImpl.hasHashKey(key, field);
    if (articleExist) {
        return hashRedisServiceImpl.get(key, field);
    }
    return null;
}

优化后的代码

/**
* 获得redis中的文章内容
*/
public Object getArticleOnRedis(String key, Object field) {
    // 减少交互
    return hashRedisServiceImpl.get(key, field);
}

之前是在redis中根据key获取值,获取值之前,还要判断key存在不存在,如果存在,则根据key查找,并返回值,如果不存在,那么直接返回null。虽然判断逻辑写的够详细,但是这样写代码,反而更加臃肿了,索性直接从key查找,直接返回,减少判断,减少与redis的交互。

三、开启thymeleaf缓存

thymeleaf是一个模板引擎,开启缓存,也就是说加载一次模板之后便不会再加载了。系统上线之后,没必要一直加载模板,所以打开模板引擎缓存就可以了。

# Templates reloading during development
spring.thymeleaf.prefix=file:src/main/resources/templates/
spring.thymeleaf.cache=false

# Static resources reloading during development
spring.resources.static-locations=file:src/main/resources/static/
spring.resources.cache-period=0

四、修改redis连接池最大活跃数

#redis配置
spring.redis.database=0
spring.redis.port=6379
spring.redis.pool.max-active=8000
spring.redis.pool.max-wait=-1
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.timeout=0

自己试过用Jmeter进行压测的时候,访问量过多,会把redis压垮,增加连接池最大活跃数,一定程度上能有效防止并发数过多而导致的宕机。