个人网站性能优化经历(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宕机或者其他问题,那么捕抓异常之后,则从数据库读取,避免用户读取不到文章信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

exodus3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值