Redis提升併發能力 | 從0開始構建SpringCloud微服務(2)

照例附上項目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;
    }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章