1. 程式人生 > >SpringBoot 天氣預報系統 新增Redis快取(2)

SpringBoot 天氣預報系統 新增Redis快取(2)

由於我們的天氣預報系統採用的是第三方的服務  所以可能出現以下幾個問題:

    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的連線????