Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)

照例附上项目github链接

本项目实现的是将一个简单的天气预报系统一步一步改造成一个SpringCloud微服务系统的过程,本节将介绍项目中Redis的引入。


Redis下载教程

若对Redis感兴趣,还可以看一下我的另一篇文章造个轮子 | 自己动手写一个Redis


存在问题:

数据来源于第三方的接口,依赖性太强。
可能带来的不良结果:

(1)延时性:用户访问我们的时候,我们需要再去访问第三方的接口,我们是数据的中间者,不是数据的产生者,有一定的延时性。

(2)访问上限:免费的接口,可能会达到上限。

(3)调死:可能将对方的接口给调死。


解决方案:

使用redis缓存系统,提高整体的并发访问能力。

Redis 是一个高性能的key-value数据库,基于内存的缓存系统,对内存的操作时非常快的,所以可以做到及时响应。


为什么选择Redis

(1)及时响应

(2)减少服务调用



Redis如何引入

Redis是一个key-value结构的数据存储系统,这里我们使用天气数据的uri作为它的key,通过ValueOperations<String, String>ops对象的set方法将数据写入缓存中,通过其get方法可以从缓存中获取数据,并且使用TIME_OUT设置缓存失效的时间。

我们并不是每次都去调用第三方的接口,若Redis缓存中有要查找的天气数据,则从缓存中取;若缓存中没有,则请求第三方接口,然后将数据写入Redis缓存中。

	private WeatherResponse doGetWeahter(String uri) {
		String key = uri;
		String strBody = null;
		ObjectMapper mapper = new ObjectMapper();
		WeatherResponse resp = null;
		ValueOperations<String, String>  ops = stringRedisTemplate.opsForValue();
		// 先查缓存,缓存有的取缓存中的数据
		if (stringRedisTemplate.hasKey(key)) {
			logger.info("Redis has data");
			strBody = ops.get(key);
		} else {
			logger.info("Redis don't has data");
			// 缓存没有,再调用服务接口来获取
	 		ResponseEntity<String> respString = restTemplate.getForEntity(uri, String.class);

	 		if (respString.getStatusCodeValue() == 200) {
				strBody = respString.getBody();
			}
			
			// 数据写入缓存
			ops.set(key, strBody, TIME_OUT, TimeUnit.SECONDS);
		}

		try {
			resp = mapper.readValue(strBody, WeatherResponse.class);
		} catch (IOException e) {
			//e.printStackTrace();
			logger.error("Error!",e);
		}
		
		return resp;
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值