照例附上項目github鏈接
本項目實現的是將一個簡單的天氣預報系統一步一步改造成一個SpringCloud微服務系統的過程,本節將介紹項目中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;
}