个人网站性能优化经历访问文章功能优化

Posted exodus3

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了个人网站性能优化经历访问文章功能优化相关的知识,希望对你有一定的参考价值。

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

这篇主要讲访问文章功能优化

redis宕机了,可以用数据库来读取文章信息

redis有时候会宕机,就比如之前遭受到的黑客攻击,导致redis宕机了。或者遇到其他异常,导致redis无法正常访问。如果这个时候继续访问博客文章,那么代码走到 Object articleByRedis = redisService.getArticleOnRedis(“article”, articleId); 这里就会直接抛出异常,通常我们对异常的解决办法是:打印异常信息。然而,如果不能实时解决redis宕机异常的话,访问文章就会一直访问不到。有效的解决办法是:抛出异常的时候,继续用数据库来访问文章,这样就能获取文章信息了,即使没有及时解决redis宕机的问题。

JSONObject getArticleById(String articleId) {
	long startTime = System.currentTimeMillis();
	String username = null;
	//取缓存
	try {
		Object articleByRedis = redisService.getArticleOnRedis("article", articleId);
		if (articleByRedis != null) {
			JSONObject jsonObject = JSONObject.fromObject(articleByRedis);
			Object articleTitle = jsonObject.get("articleTitle");
			logger.info("取缓存里面的文章:" + articleTitle);
			dealWithSpendTime(startTime);
			return jsonObject;
		} else {
			//取数据库
			JSONObject articleByDB = articleService.getArticleByArticleId(Long.parseLong(articleId), username);
			if (articleByDB != null) {
				logger.info("取数据库里面的文章:{}", articleByDB.get("articleTitle"));
				String status = (String)articleByDB.get("status");
				if ("200".equals(status)) {
					redisService.putArticleOnRedis("article", articleId, articleByDB);
					logger.info("保存文章到缓存");
				} else {
					logger.info("没获取到文章,不用保存到缓存");
				}
			}
			dealWithSpendTime(startTime);
			return articleByDB;
		}
	} catch (Exception e) {
		logger.error("取缓存报异常了:" + e.getMessage());
		//取数据库
		JSONObject articleByDB = articleService.getArticleByArticleId(Long.parseLong(articleId), username);
		if (articleByDB != null) {
			logger.info("有异常,读取数据库里面的文章");
		}
		dealWithSpendTime(startTime);
		return articleByDB;
	}
}

// 计算花费的时间
private void dealWithSpendTime(long startTime) {
	long endTime = System.currentTimeMillis();
	long spendTime = endTime - startTime;
	if (spendTime < 1000) {
		logger.info("读取这篇文章花费的时间为:" + spendTime + "毫秒");
	} else {
		logger.warn("****读取这篇文章花费的时间比较多****:" + spendTime / 1000 + "秒");
	}
}

这段代码的主要逻辑是:先从redis读取文章,没获取到,从数据库读取,把读取到的信息保存到redis里。如果遇到redis宕机或者其他问题,那么捕抓异常之后,则从数据库读取,避免用户读取不到文章信息。

以上是关于个人网站性能优化经历访问文章功能优化的主要内容,如果未能解决你的问题,请参考以下文章

个人网站性能优化经历其他优化

个人网站性能优化经历网站安全方面优化

个人网站性能优化经历CDN优化过程

个人网站性能优化经历Redis优化过程

个人网站性能优化经历Nginx中间件优化

个人网站性能优化经历插件的拓展