共计 1312 个字符,预计需要花费 4 分钟才能阅读完成。
照例附上项目 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;
}