这是学习的第二篇文章,很显然,这个免费的接口能承受的并发是很低的,并且我们的服务器作为一个中转站去向这个接口请求数据也非常地耗时,于性能和稳定性都没有保障,所以我们需要redis作为缓存来提高性能。所以,我们需要用redis来重构一下。

先引入一下依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

思路很简单:缓存中有数据的时候,就直接从缓存中拿即可,若缓存中没有此数据,就去调用接口重新获取并且再存到缓存中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
private static final long TIME_OUT = 30*60L;

private WeatherResponse doGetWeather(String uri){
//先去缓存中查询,有就直接拿缓存中的数据,否则调用接口
String key = uri;
String strBody = null;
WeatherResponse resp = null;
ObjectMapper mapper = new ObjectMapper();

ValueOperations<String,String> ops = stringRedisTemplate.opsForValue();


if(stringRedisTemplate.hasKey(uri)){
//缓存有数据
log.info("Redis has data!");
strBody = ops.get(key);
}else{
//缓存没有数据
log.info("Redis don't thas data!");
ResponseEntity<String> resString = restTemplate.getForEntity(uri,String.class);



if(resString.getStatusCodeValue() == 200) {
strBody = resString.getBody();
}

//数据写入缓存
ops.set(key,strBody,TIME_OUT, TimeUnit.SECONDS);
}

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

return resp;
}

一开始可以将过期时间缩短一点,这里redis直接启动即可,默认端口是6379.