SpringBoot 天氣預報系統 新增Redis快取(2)
阿新 • • 發佈:2018-11-30
由於我們的天氣預報系統採用的是第三方的服務 所以可能出現以下幾個問題:
1)使用者呼叫我們的介面 響應的時間過長
2)可能有呼叫次數的限制
3)併發訪問量時 不能很好地處理或者給第三方帶來過大的壓力
解決方法:新增Redis快取 redis時key-value的鍵值儲存方式 讀取速度很快 可以使用快取來解決問題
及時響應,減少服務呼叫的次數。
實現:
需要redis 3.2.100 以及新增依賴;
compile("org.springframework.boot:spring-boot-starter-data-redis")
下載windows redis3.2.100
下載目錄:windows版:https://github.com/MSOpenTech/redis/releases
解壓到本地目錄
cmd ---->切換到解壓目錄---->redis-server.exe redis.windows.conf 啟動redis服務
修改Service類:
/**
* 根據傳入的url返回WeatherResponse物件
*
* @param url
* @return
*/
private WeatherResponse getDataByUrl(String url) {
//將url作為key
String key = url;
String responseBody = null;
ValueOperations<String,String> ops = stringRedisTemplate.opsForValue();
//在redis中是否存在快取 如有查快取 若沒有用服務
if(stringRedisTemplate.hasKey(key)){
//有快取
logger.info("redis has data ,key={}",key);
responseBody = ops.get(key);
}else{
//獲取到url返回的內容 String型別
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
int statusCode = responseEntity.getStatusCodeValue();
if(statusCode == 200){
responseBody = responseEntity.getBody();
}
//寫入快取 30分鐘過期
logger.info("redis 新增快取 ,key={}",key);
ops.set(key,responseBody,TIME_OUT, TimeUnit.SECONDS);
}
//將json資料放到物件中
ObjectMapper mapper = new ObjectMapper();
WeatherResponse ws = null;
try {
ws = mapper.readValue(responseBody,WeatherResponse.class);
} catch (IOException e) {
//e.printStackTrace();
logger.error("error!! e={}",e.getMessage());
}
return ws;
}
瀏覽器訪問:http://localhost:8080/weather/cityName/北京
沒有配置redis的連線????沒有配置redis的連線????沒有配置redis的連線????沒有配置redis的連線????