第十六章:使用Redis作為SpringBoot項(xiàng)目數(shù)據(jù)緩存

我們平時(shí)在項(xiàng)目中設(shè)計(jì)數(shù)據(jù)訪問的時(shí)候往往都是采用直接訪問數(shù)據(jù)庫(kù),采用數(shù)據(jù)庫(kù)連接池來實(shí)現(xiàn),但是如果我們的項(xiàng)目訪問量過大或者訪問過于頻繁,將會(huì)對(duì)我們的數(shù)據(jù)庫(kù)帶來很大的壓力。為了解決這個(gè)問題從而redis數(shù)據(jù)庫(kù)脫穎而出,redis數(shù)據(jù)庫(kù)出現(xiàn)時(shí)是以非關(guān)系數(shù)據(jù)庫(kù)的光環(huán)展示在廣大程序猿的面前的,后來redis的迭代版本支持了緩存數(shù)據(jù)、登錄session狀態(tài)(分布式session共享)等。所以又被作為內(nèi)存緩存的形式應(yīng)用到大型企業(yè)級(jí)項(xiàng)目中。

免費(fèi)專題文章匯總

恒宇少年在博客整理出來了SpringBoot、ApiBoot、SpringCloud的文章匯總【SpringBoot基礎(chǔ)教程專題】,【SpringCloud基礎(chǔ)教程專題】,【ApiBoot組件使用專題

本章目標(biāo)

實(shí)現(xiàn)SpringBoot項(xiàng)目中整合Redis非關(guān)系數(shù)據(jù)庫(kù)作為內(nèi)存緩存框架,并測(cè)試數(shù)據(jù)讀取源。

安裝Redis

官網(wǎng)的redis僅支持Linux服務(wù)器的安裝版本,由于開發(fā)人員都是在windows上工作,所以GitHub上的牛人基于linux平臺(tái)下的Redis實(shí)現(xiàn)了windows版本。

下載Windows版本Redis

我們直接訪問github網(wǎng)址:github.com/MSOpenTech/redis/releases,下載最新的windows X64版本的壓縮包,如下圖1所示:

圖1

我們下載第二個(gè)就可以了,第一個(gè)是安裝程序方式可以直接安裝不過不太喜歡那種形式,第二個(gè)則是壓縮包的形式解壓完就可以用,第三、四個(gè)都是源碼文件。下載完成后隨便解壓到我們的盤符內(nèi)的文件即可,如下圖2所示:

圖2

開啟Redis

解壓完成后我們來開啟Redis數(shù)據(jù)庫(kù),Redis數(shù)據(jù)庫(kù)的默認(rèn)端口是6379,如果已經(jīng)被其他應(yīng)用程序占用,請(qǐng)自行修改redis.windows.conf配置文件,修改位置如下圖3所示:

圖3

如果沒有端口沒有被占用,我們需要在cmd命令窗口執(zhí)行運(yùn)行Redis,我們首先使用cmd命令進(jìn)入到Redis解壓目錄并且執(zhí)行redis-server.exe redis.windows.conf命令即可,如下圖4所示:

圖4

可以看到上述圖4,我們的redis數(shù)據(jù)庫(kù)已經(jīng)啟動(dòng)了,下面輸出日志開啟了服務(wù)鏈接在6379端口。好了我們的數(shù)據(jù)庫(kù)已經(jīng)配置完成了,接下來我們來構(gòu)建SpringBoot整合Redis項(xiàng)目。

構(gòu)建項(xiàng)目

我們使用IntelliJ IDEA工具構(gòu)建一個(gè)SpringBoot項(xiàng)目,預(yù)先添加依賴Web、MySQL、JPA、Druid等。項(xiàng)目結(jié)構(gòu)如下圖5所示:

圖5

接下來復(fù)制第十三章:SpringBoot實(shí)戰(zhàn)SpringDataJPA文章項(xiàng)目源碼(源碼地址:git.oschina.net/jnyqy/lessons)的application.yml配置文件到本章節(jié)項(xiàng)目的resources目錄下,如下圖6所示:

圖6

自行修改本地的數(shù)據(jù)庫(kù)連接池的連接地址、用戶名、密碼就可以了。這個(gè)配置是我本地的!

配置支持Redis

構(gòu)建完成后我們需要讓我們的SpringBoot項(xiàng)目支持Redis數(shù)據(jù)庫(kù)才能完成緩存的操作。

添加Redis依賴

我們打開pom.xml配置文件添加對(duì)應(yīng)的redis緩存依賴maven配置,如下圖7所示:

圖7

我們添加緩存的支持需要兩個(gè)依賴,一個(gè)是SpringBoot內(nèi)部的緩存配置、另外則是我們的redis緩存。

配置Redis數(shù)據(jù)庫(kù)

依賴添加完成后,需要配置我們本地的redis數(shù)據(jù)庫(kù)連接到項(xiàng)目中,我們打開application.yml配置文件添加如下圖8所示的配置內(nèi)容:

圖8

配置CacheManager

下面我們需要讓SpringBoot內(nèi)置的緩存框架使用我們的Redis作為新的緩存,我們來添加一個(gè)RedisConfiguration的配置類,并添加對(duì)應(yīng)的配置如下圖9所示:

圖9

我們使用@EnableCaching注解來開啟我們的項(xiàng)目支持緩存,我們?cè)谂渲妙悆?nèi)添加了方法cacheManager(),方法的返回值則是使用了我們的Redis緩存的管理器,SpringBoot項(xiàng)目啟動(dòng)時(shí)就會(huì)去找自定義配置的CacheManager對(duì)象并且自動(dòng)應(yīng)用到項(xiàng)目中。

上述就是有關(guān)Redis的所有配置,現(xiàn)在我們來編寫一個(gè)測(cè)試的請(qǐng)求讀取數(shù)據(jù)庫(kù)內(nèi)的單表數(shù)據(jù),查看是否已經(jīng)可以緩存數(shù)據(jù)。

使用Redis

我們現(xiàn)在我們本地的MySQL數(shù)據(jù)庫(kù)內(nèi)創(chuàng)建一張表結(jié)構(gòu),如下圖10所示:

圖10

表內(nèi)就是幾個(gè)簡(jiǎn)單的測(cè)試字段,下面我們根據(jù)對(duì)應(yīng)的字段創(chuàng)建UserEntity,代碼如下圖11所示:

圖11

截圖省略了getter/setter,請(qǐng)自行添加上。下面我們根據(jù)UserEntity創(chuàng)建一個(gè)SpringDataJPA支持的JPA接口,(如需了解SpringDataJPA請(qǐng)?jiān)L問:第十三章:SpringBoot實(shí)戰(zhàn)SpringDataJPA)接口代碼如下圖12所示:

圖12

創(chuàng)建JPA完成后,我們對(duì)應(yīng)的創(chuàng)建一個(gè)業(yè)務(wù)邏輯服務(wù)類:UserService,我們?cè)赟ervice內(nèi)添加redis的緩存支持,如下圖13所示:

圖13

在上圖13內(nèi)有兩個(gè)新的注解,

@CacheConfig:該注解是用來開啟聲明的類參與緩存,如果方法內(nèi)的@Cacheable注解沒有添加key值,那么會(huì)自動(dòng)使用cahceNames配置參數(shù)并且追加方法名。
@Cacheable:配置方法的緩存參數(shù),可自定義緩存的key以及value。

再來添加一個(gè)名叫UserController的控制器,使用@RestController風(fēng)格注解。如下圖14所示:

圖14

好了,下面我們來啟動(dòng)項(xiàng)目訪問地址查看效果。

測(cè)試Redis

運(yùn)行項(xiàng)目并查看控制臺(tái)輸出的日志是否存在異常,啟動(dòng)成功后訪問地址:127.0.0.1:8080/list,界面輸出內(nèi)容如下圖15所示:

圖15

數(shù)據(jù)為測(cè)試數(shù)據(jù),在啟動(dòng)項(xiàng)目之前需要手動(dòng)添加到數(shù)據(jù)庫(kù)。我們?cè)賮砜聪驴刂婆_(tái)輸出的SQL,如下圖16所示:

圖16

可以看到是正常的訪問數(shù)據(jù)庫(kù)并且執(zhí)行了JPA自動(dòng)生成的SQL,那么為了驗(yàn)證Redis緩存,我們?cè)賮碚?qǐng)求依次列表,界面輸出內(nèi)容如下圖17所示:

圖17

可以看到我們同樣是可以訪問到數(shù)據(jù)的,而且跟上次訪問列表的數(shù)據(jù)一致,那么神奇的地方來了,我們?nèi)タ聪驴刂婆_(tái)的SQL輸出,如下圖18所示:

圖18

可以看到只有一次輸出,這個(gè)輸出還是我們上次訪問的時(shí)候執(zhí)行的,證明我們配置的Redis緩存已經(jīng)生效,下面我們使用Redis的客戶端來查看下是否已經(jīng)存在。

使用Redis-Cli客戶端

我們使用Cmd命令進(jìn)入我們的Redis解壓目錄,并執(zhí)行redis-cli.exe應(yīng)用程序,效果如下圖19所示:

圖19

可以看到Redis為我們自動(dòng)生成的Key讓我們很無奈,根本看不懂!那我們以后維護(hù)起來就很復(fù)雜了。下面我們來自定義Redis生成Key的規(guī)則!

自定義Key

我們打開RedisConfiguration配置類,添加繼承CachingConfigurerSupport類,并重寫方法keyGenerator(),代碼如下圖20所示:

圖20

如上圖20所述,我們根據(jù)類名、方法名、參數(shù)列表等完成自定義Redis緩存的Key定義,下面我們重啟下項(xiàng)目,兩次訪問127.0.0.1:8080/list地址查看界面輸出,如下圖21所示:

圖21

可以看到跟我們之前一樣,第一次放了數(shù)據(jù)庫(kù),第二次查詢了緩存數(shù)據(jù),我們?cè)賮硗ㄟ^redis-cli客戶端查看下數(shù)據(jù)庫(kù)內(nèi)保存的key是否已經(jīng)按照我們自定義規(guī)則生成。如下圖22所示:

圖22

可以看到第二條,就是根據(jù)我們規(guī)則生成的key。

Redis命令

Redis數(shù)據(jù)庫(kù)內(nèi)有很多個(gè)命令下面我簡(jiǎn)單介紹幾個(gè)大家在日常開發(fā)中常用到的。

flushdb:清空當(dāng)前數(shù)據(jù)庫(kù)。
select [index]:選擇索引數(shù)據(jù)庫(kù),index為索引值名,如:select 1。
del [key]:刪除一條指定key的值。
keys *:查看數(shù)據(jù)庫(kù)內(nèi)所有的key。
flushall:清空所有數(shù)據(jù)庫(kù)。
quit:退出客戶端連接。

總結(jié)

以上所述就是本章的全部講解內(nèi)容,本章主要講解了SpringBoot項(xiàng)目中如何使用Redis非關(guān)系型數(shù)據(jù)庫(kù)作為緩存框架,并完成自定義Redis生成的key值。

本章所用到的數(shù)據(jù)庫(kù)已經(jīng)放置到resources目錄下,請(qǐng)?jiān)L問碼云下載。

本章代碼已經(jīng)上傳到碼云:

SpringBoot配套源碼地址:https://gitee.com/hengboy/spring-boot-chapter

SpringCloud配套源碼地址:https://gitee.com/hengboy/spring-cloud-chapter

SpringBoot相關(guān)系列文章請(qǐng)?jiān)L問:目錄:SpringBoot學(xué)習(xí)目錄

QueryDSL相關(guān)系列文章請(qǐng)?jiān)L問:QueryDSL通用查詢框架學(xué)習(xí)目錄

SpringDataJPA相關(guān)系列文章請(qǐng)?jiān)L問:目錄:SpringDataJPA學(xué)習(xí)目錄

SpringBoot相關(guān)文章請(qǐng)?jiān)L問:目錄:SpringBoot學(xué)習(xí)目錄,感謝閱讀!

歡迎微信掃碼加入知識(shí)星球,恒宇少年帶你走以后的技術(shù)道路!!!

知識(shí)星球 - 恒宇少年

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,185評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,446評(píng)論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,951評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,189評(píng)論 0 287
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,718評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,800評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評(píng)論 1 281
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,420評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,755評(píng)論 2 371

推薦閱讀更多精彩內(nèi)容