栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

自己搭建了一个基于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宕机或者其他问题,那么捕抓异常之后,则从数据库读取,避免用户读取不到文章信息。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/354112.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号