有時,為了提公升整個**的效能,我們會將經常需要訪問資料快取起來,這樣,在下次查詢的時候,能快速的找到這些資料。
快取的使用與系統的時效性有著非常大的關係。當我們的系統時效性要求不高時,則選擇使用快取是極好的。當系統要求的時效性比較高時,則並不適合用快取。
本文,我們將演示如何通過整合 redis 伺服器來進行資料的快取,以提高微服務的併發訪問能力。
為啥我們需要快取
在之前的文章中,我們已經介紹了如何使用 spring boot 來快速實現乙個天氣預報服務應用micro-weather-basic
(見 通過該應用,能實現簡單的天氣查詢。
天氣資料介面,本身時效性不是很高,而且又因為是 web 服務,在呼叫過程中,本身是存在延時的。所以,採用快取,一方面可以有效減輕訪問天氣介面服務帶來的延時問題,另一方面,也可以減輕天氣介面的負擔,提高併發訪問量。
特別地,我們是使用的第三方免費的天氣 api,這些 api 往往對使用者的呼叫次數及頻率有一定的限制。所以為了減輕天氣 api 提供方的負荷,我們並不需要實時去呼叫其第三方介面。
在micro-weather-basic
的基礎上,我們構建了乙個micro-weather-redis
專案,作為示例。
開發環境
為了演示本例子,需要採用如下開發環境:
專案配置
spring boot data redis 提供了 spring boot 對 redis 的開箱即用的功能。在原有的依賴的基礎上,新增 spring boot data redis starter 的依賴。
// 依賴關係
dependencies
在 linux 平台上安裝 redis 比較簡單,可以參考官方文件來即可,詳見
安裝後,redis 預設執行在 位址埠
修改 weatherdataserviceimpl
修改 weatherdataserviceimpl,增加了 stringredistemplate 用於操作 redis。
@service
public
class
weatherdataserviceimpl
implements
weatherdataservice
@override
public
weatherresponse
getdatabycityname
(string
cityname
)private
weatherresponse
dogetweatherdata
(string
uri)
ops.
set(
key,
strbody
,time_out
,timeunit
.seconds);}
else
=new
();weatherresponse
weather
=null
;try
catch
(ioexceptione)
return
weather;}
}
修改了 dogetweatherdata 方法,增加了 redis 資料的判斷:
其中,當然 stringredistemplate 跟 redistemplate 功能類似,都是封裝了對 redis 的一些常用的操作。區別在於,stringredistemplate 更加專注於基於字串的操作,畢竟,在目前咱們的天氣預報應用中,資料的格式主要是 json 字串。
valueoperations 介面,封裝了大部分的簡單的 k-v 操作。
同時,我們也使用了日誌框架,用來記錄執行過程,及日常的資訊。
測試、執行
首先,在進行測試前,需要將 redis 伺服器啟動起來。
我們可以通過在乙個時間段內,多次訪問同乙個個天氣介面來測試效果,比如,介面 http://localhost:8080/weather/cityid/101280601。為了縮短測試的時間,我們可以將 redis 的超時時間縮短一點,比如10秒。這樣,你就不用苦等30分鐘才能驗證資料是否過期了。
2017-10
-1823:
51:41.762
info
15220
---[
nio-
8080
-exec-6
]c.w
.s.c
.w.s
.weatherdataserviceimpl
:未找到
.weatherdataserviceimpl:找到
:, value=,"city":"深圳","aqi":"35","forecast":[,,,,],"ganmao":"各項氣象條件適宜,無明顯降溫過程,發生感冒機率較低。","wendu":"25"},"status":1000,"desc":"ok"}
2017-10
-1823:
51:46.700
info
15220
---[
nio-
8080
-exec-7
]c.w
.s.c
.w.s
.weatherdataserviceimpl:找到
:, value=,"city":"深圳","aqi":"35","forecast":[,,,,],"ganmao":"各項氣象條件適宜,無明顯降溫過程,發生感冒機率較低。","wendu":"25"},"status":1000,"desc":"ok"}
2017-10
-1823:
51:50.513
info
15220
---[
nio-
8080
-exec-8
]c.w
.s.c
.w.s
.weatherdataserviceimpl:找到
:, value=,"city":"深圳","aqi":"35","forecast":[,,,,],"ganmao":"各項氣象條件適宜,無明顯降溫過程,發生感冒機率較低。","wendu":"25"},"status":1000,"desc":"ok"}
2017-10
-1823:
51:53.140
info
15220
---[
nio-
8080
-exec-9
]c.w
.s.c
.w.s
.weatherdataserviceimpl
:未找到
:
從上述日誌可以看到,第一次(23:51:41)訪問介面時,沒有找到 redis 裡面的資料,所以,就初始化了資料。
後面幾次訪問,都是訪問 redis 裡面的資料。最後一次(23:51:53),由於超時了,所以 redis 裡面又沒有資料了,所以又會拿天氣介面的資料。
原始碼本章節的原始碼,見 samples目錄下的micro-weather-redis
目錄下。
基於python的終端天氣查詢
開發十年,就只剩下這套架構體系了!網上搜了乙個,最開始準備使用中國天氣網的資料介面,但是需要註冊,也行,註冊就註冊吧。註冊好了,又提示資訊不完整,好吧,填寫姓名 身份證.最後,還要上傳身份證資訊,看到這我不想用它了,緊接著發現,還要填寫使用該介面的伺服器ip。頓時,心中十萬個那個啥呼嘯而過.城市介面...
基於NoneBot的天氣查詢外掛程式
搞了一會才弄出了個天氣的外掛程式,主要是根據官方文件的完善,從而能實現查詢天氣的功能。主函式 init py from nonebot import on command,commandsession from nonebot import on natural language,nlpsessio...
基於SpringBoot開發
使用idea配置springboot專案 專案結構 而 configuration 經常與 bean 組合使用,使用這兩個註解就可以建立乙個簡單的spring 配置類,可以用來替代相應的xml 配置檔案。enableautocon figuration 能夠自動配置spring 的上下文,猜測和配置...