秦溧 艾青
摘要:隨著互聯(lián)網(wǎng)業(yè)務(wù)的逐漸擴(kuò)大,用戶對(duì)相同數(shù)據(jù)訪問(wèn)的相對(duì)集中,從而出現(xiàn)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)負(fù)擔(dān)加重,數(shù)據(jù)庫(kù)響應(yīng)效率低下,瀏覽器上響應(yīng)延遲等重大問(wèn)題。基于此,提出采用Redis高性能分布式內(nèi)存緩存服務(wù)器的這一技術(shù),來(lái)解決因數(shù)據(jù)量過(guò)大導(dǎo)致頁(yè)面響應(yīng)延遲的問(wèn)題。通過(guò)實(shí)驗(yàn)以及和傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)對(duì)比的結(jié)果表明,利用緩存技術(shù)查找數(shù)據(jù),可以在一定程度上減少對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),同時(shí)加快Web等應(yīng)用的響應(yīng)速度,提高用戶體驗(yàn)感。
關(guān)鍵詞:Redis;Sql;緩存;數(shù)據(jù)庫(kù)
中圖分類(lèi)號(hào):TP311.5文獻(xiàn)標(biāo)識(shí)碼:A
目前我們所設(shè)計(jì)的系統(tǒng)采用的是關(guān)系型數(shù)據(jù)庫(kù),將數(shù)據(jù)存儲(chǔ)到該系統(tǒng)中,再通過(guò)服務(wù)器從中獲取數(shù)據(jù),并在瀏覽器上顯示出來(lái)。但隨著數(shù)據(jù)量逐漸增大,用戶度對(duì)相同數(shù)據(jù)訪問(wèn)的集中,就會(huì)出現(xiàn)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)負(fù)擔(dān)加重,數(shù)據(jù)庫(kù)響應(yīng)效率低下,瀏覽器上響應(yīng)延遲等重大問(wèn)題。特別是當(dāng)我們?cè)陂_(kāi)發(fā)Web應(yīng)用時(shí),前端界面成為了不可獲取的一部分,但是每次用戶對(duì)我們的網(wǎng)頁(yè)進(jìn)行訪問(wèn)時(shí),都要重新加載一次靜態(tài)資源,從而加重服務(wù)器的負(fù)擔(dān),造成網(wǎng)上顯示延遲等問(wèn)題,在很大程度上影響了用戶體驗(yàn)感。基于以上問(wèn)題,本文結(jié)合Redis高性能分布式內(nèi)存緩存服務(wù)器技術(shù),對(duì)頁(yè)面進(jìn)行分布式管理。并通過(guò)實(shí)驗(yàn)和對(duì)比證實(shí)了利用緩存技術(shù)查找數(shù)據(jù),可以在一定程度上減少對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),同時(shí)加快Web等應(yīng)用的響應(yīng)速度,提高用戶體驗(yàn)感。
1 Redis概述
1.1 Redis的特性
Redis是一個(gè)基于鍵值對(duì)的存儲(chǔ)結(jié)構(gòu)的系統(tǒng),也是類(lèi)屬于NOSQL的一種,它可以利用多種不同的鍵值對(duì)數(shù)據(jù)類(lèi)型來(lái)滿足于不同的存儲(chǔ)需求,Redis優(yōu)勢(shì)主要包括:
(1)性能高。由于Redis是NoSql數(shù)據(jù)庫(kù),Redis的所有操作都是直接操作于內(nèi)存之中,它的運(yùn)行速度相比較于MySQL這一類(lèi)傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù),就好比是在內(nèi)存中進(jìn)行讀寫(xiě)和在硬盤(pán)中進(jìn)行讀寫(xiě)的差距;
(2)可使用的數(shù)據(jù)類(lèi)型非常豐富,Redis能夠支持二進(jìn)制的Hash,Set,String,List等數(shù)據(jù)類(lèi)型的操作;
(3)支持事務(wù),操作都是原子性,所謂的原子性就是對(duì)數(shù)據(jù)的更改要么全部執(zhí)行,要么全部不執(zhí)行;
(4)豐富的特性,Redis還支持publish/subscribe,通知,key過(guò)期等等特性。基于上述優(yōu)勢(shì),Redis技術(shù)最大的應(yīng)用場(chǎng)景就是用來(lái)做緩存。緩存技術(shù)可以大大減輕服務(wù)器的壓力,減少數(shù)據(jù)丟失,提高系統(tǒng)中數(shù)據(jù)的一致性和完整性。[1]
Redis對(duì)于不同的常見(jiàn)數(shù)據(jù)類(lèi)型來(lái)說(shuō),指令既有相同的,也有針對(duì)不同數(shù)據(jù)類(lèi)型的特殊指令。同時(shí)Redis具有Java版本客戶端Jedis,Jedis擁有Java的主要特性之一多線程處理,通過(guò)線程來(lái)優(yōu)化系統(tǒng)資源,通過(guò)線程操作Redis的數(shù)據(jù),并根據(jù)實(shí)際情況對(duì)線程進(jìn)行回收,極大的提高的Redis的使用效率。在提高數(shù)據(jù)獲取速度時(shí),我們需要用一些緩存技術(shù),Redis的最大優(yōu)勢(shì)在于可將數(shù)據(jù)緩存到內(nèi)存并能夠分片存儲(chǔ),同時(shí)擁有很高的讀寫(xiě)效率。[2]
在這個(gè)基礎(chǔ)之上,Redis還可以使用各種不同方式的排序,以此來(lái)滿足各種不同業(yè)務(wù)的需求,為了不影響查詢(xún)數(shù)據(jù)的速度,數(shù)據(jù)一般都是先在內(nèi)存中緩存下來(lái),區(qū)別就是Redis會(huì)在經(jīng)過(guò)一段周期后的將更新后的數(shù)據(jù)重新在磁盤(pán)中進(jìn)行寫(xiě)入和覆蓋,又或者會(huì)把進(jìn)行修改的操作寫(xiě)入記錄文件中,再將此文件追加到之前的記錄文件中。前者為默認(rèn)的RDB存儲(chǔ)模式,所謂RDB,就是將數(shù)據(jù)寫(xiě)入到一個(gè)臨時(shí)的文件。等到持久化結(jié)束之后,用這個(gè)臨時(shí)文件,替換掉上次舊的持久化的文件,從而達(dá)到恢復(fù)數(shù)據(jù)的目的。優(yōu)點(diǎn),是只需要通過(guò)使用單獨(dú)子進(jìn)程來(lái)進(jìn)行持久化操作,并不需要主進(jìn)程進(jìn)行任何的IO操作,從而保證了redis的高效性;缺點(diǎn),RDB會(huì)間隔一段時(shí)間再進(jìn)行持久化操作,如果在持久化期間,redis發(fā)生了故障,會(huì)出現(xiàn)數(shù)據(jù)的丟失情況,所以這種方式更適合對(duì)數(shù)據(jù)要求不嚴(yán)謹(jǐn)?shù)臅r(shí)候。由于只需要對(duì)界面的數(shù)據(jù)進(jìn)行緩存,所以本文采用RDB存儲(chǔ)模式技術(shù)便可達(dá)到需求。
1.2 Redis存儲(chǔ)機(jī)制
其存儲(chǔ)機(jī)制默認(rèn)設(shè)置為如果更改了一個(gè)Key,則間隔900秒之后進(jìn)行一次持久化存儲(chǔ)。如果更改了十個(gè)Key則300秒之后進(jìn)行一次持久化存儲(chǔ),如果更改一萬(wàn)個(gè)Key則自修改之時(shí)起,一分鐘之后進(jìn)行一次持久化存儲(chǔ),持久化完成后,將臨時(shí)文件替換掉舊的RDB。
使用RDB恢復(fù)數(shù)據(jù)也非常簡(jiǎn)單,實(shí)際上只需重啟Redis服務(wù)即可完成。啟動(dòng)的時(shí)候,redis的sever會(huì)從dump.rdb文件中先同步數(shù)據(jù),第二種方式是AOF,是將執(zhí)行過(guò)的指令記錄下來(lái),數(shù)據(jù)恢復(fù)時(shí),按照從前到后的順序再將指令執(zhí)行一遍從而實(shí)現(xiàn)數(shù)據(jù)的恢復(fù)。優(yōu)點(diǎn),可以保持更高的數(shù)據(jù)完整性。例如,如果設(shè)置追擊File的時(shí)間是一秒,那么一旦Redis發(fā)生了故障,最多只會(huì)丟失那一秒的數(shù)據(jù)。且如果日志寫(xiě)入不夠完整,支持通過(guò)RedisCheckAof來(lái)進(jìn)行日志修復(fù),Aof文件沒(méi)備注right之前可以刪除其中的某些指令。缺點(diǎn),aof比rdb文件大,且恢復(fù)速度慢,因?yàn)樗且杂涗洸僮鲾?shù)據(jù)為主的。
此外,通信業(yè)務(wù)的數(shù)據(jù)大部分都是數(shù)字信息,如手機(jī)號(hào)碼、imsi碼等,采用az,AZ,09組成的62進(jìn)制替代10進(jìn)制可以大大的節(jié)約內(nèi)存,手機(jī)號(hào)碼可以從11位壓縮到6位,imsi碼可以從15位壓縮到9位。由此可以進(jìn)一步節(jié)約內(nèi)存。[3]
redis的應(yīng)用目前已經(jīng)十分廣泛,國(guó)內(nèi)的淘寶,新浪,以及國(guó)外的GitHub等都在使用Redis的緩存服務(wù)。
當(dāng)然,在使用Redis緩存技術(shù)之前,必須搭建分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)。為了進(jìn)一步提高Redis的分布式數(shù)據(jù)存儲(chǔ)的效率,必須同時(shí)要考慮到數(shù)據(jù)庫(kù)的負(fù)載情況,因此在開(kāi)發(fā)時(shí)還需要額外搭建另一個(gè)分布式存儲(chǔ)系統(tǒng)。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)采用中央處理器或者是內(nèi)存的使用來(lái)進(jìn)行代價(jià)的評(píng)估,但對(duì)于這種系統(tǒng)的存儲(chǔ)方式和數(shù)據(jù)類(lèi)型往往不是很全面。在實(shí)際運(yùn)行的過(guò)程中,對(duì)多類(lèi)資源數(shù)據(jù)進(jìn)行實(shí)時(shí)的統(tǒng)計(jì),當(dāng)完成對(duì)執(zhí)行處理任務(wù)的線程后,完成對(duì)永不服務(wù)的主線程的響應(yīng),再以此為基礎(chǔ),確定各個(gè)影響數(shù)據(jù)存儲(chǔ)有效性的影響因素,實(shí)現(xiàn)對(duì)分布式數(shù)據(jù)的可靠性評(píng)測(cè)和存儲(chǔ)。[4]
2 采用Redis進(jìn)行頁(yè)面緩存的設(shè)計(jì)方案,以及后臺(tái)配置文件的編寫(xiě)
2.1 Redis解決頁(yè)面緩存問(wèn)題的方案設(shè)計(jì)
Redis作為一個(gè)NoSQL數(shù)據(jù)庫(kù),它的簡(jiǎn)單易用是它最主要的特點(diǎn)。它的本質(zhì)其實(shí)是和布隆過(guò)濾器[5]類(lèi)似,只是作為一個(gè)服務(wù)器和數(shù)據(jù)庫(kù)之間的一個(gè)緩沖區(qū),當(dāng)用戶要訪問(wèn)數(shù)據(jù)庫(kù)時(shí),先訪問(wèn)Redis,如果Redis中有所需要的數(shù)據(jù),便直接取出,返回到服務(wù)器;如果沒(méi)有,便去訪問(wèn)數(shù)據(jù)庫(kù),將數(shù)據(jù)庫(kù)中的數(shù)據(jù)返回給服務(wù)器,同時(shí)將數(shù)據(jù)保存一份到Redis中,便于下次的取和用。
根據(jù)此特性,我可以解決頁(yè)面緩存的問(wèn)題。實(shí)際上,我們的前端界面的靜態(tài)資源,對(duì)用戶體驗(yàn)感影響最大的,便是我們界面上的圖片信息,因?yàn)檫@是用戶最容易注意到的,也是經(jīng)常在改變的,所以我們需要將界面上的圖片信息,緩存到我們的Redis數(shù)據(jù)庫(kù)中。
由于Redis存儲(chǔ)機(jī)制是以鍵值對(duì)的形式進(jìn)行存儲(chǔ)的,因此,我們只需要通過(guò)后端來(lái)實(shí)現(xiàn),將圖片的索引作為鍵,將圖片的路徑等信息以JSON的形式作為值緩存到Redis中,從而達(dá)到無(wú)需訪問(wèn)數(shù)據(jù)庫(kù),便可加載圖片的目的。當(dāng)然,如果我們后期需要對(duì)圖片進(jìn)行更新,用戶也只需要重新加載一次頁(yè)面便可更新Redis中的緩存信息。
2.2 Redis緩存技術(shù)設(shè)計(jì)流圖
該圖用于展示服務(wù)器在進(jìn)行數(shù)據(jù)存取時(shí)和Redis以及數(shù)據(jù)庫(kù)之間的交互流程,如圖1所示,當(dāng)服務(wù)器要獲取相應(yīng)的數(shù)據(jù)時(shí),先從Redis中獲取,如果命中,則直接返回給服務(wù)器;如果未命中,則再?gòu)臄?shù)據(jù)庫(kù)中獲取,獲取到數(shù)據(jù)后,返回給服務(wù)器,并更新Redis中的內(nèi)容。
2.3 Redis配置文件信息
配置使用Redis所需要的相關(guān)信息,如圖2所示:
(1)spring.redis.database:數(shù)據(jù)庫(kù)索引,在使用Redis時(shí),由于Redis有16個(gè)內(nèi)置庫(kù),需要標(biāo)明使用哪個(gè)數(shù)據(jù)庫(kù),默認(rèn)是用的是下標(biāo)為0的庫(kù),這里設(shè)置的是索引為1的庫(kù);
(2)spring.redis.host:Redis服務(wù)器地址,由于Redis是分布式的緩存數(shù)據(jù)庫(kù),所以需要單獨(dú)部署到一臺(tái)計(jì)算機(jī)上,這里部署到的是Linux虛擬機(jī)上,虛擬機(jī)的IP地址是:192.168.220.128,所以Redis的服務(wù)器地址是:192.168.220.128;
(3)spring.redis.port:Redis服務(wù)器連接端口,Redis的配置文件中,端口號(hào)默認(rèn)配置為6379;
(4)spring.redis.password:Redis服務(wù)器連接密碼,其實(shí)Redis默認(rèn)連接是沒(méi)有密碼的,這里為了保險(xiǎn)起見(jiàn)在Redis的配置文件中設(shè)置連接Redis的密碼為:imooc;
(5)spring.redis.pool.maxactive:連接池最大連接數(shù),這里可以設(shè)置同時(shí)訪問(wèn)Redis的連接數(shù)量,如果設(shè)置為負(fù)值則表示沒(méi)有連接的限制;
(6)spring.redis.pool.maxwait:連接池最大阻塞等待時(shí)間,是指建立連接的最大等待時(shí)間,毫秒為單位,如果是負(fù)值,則表示永遠(yuǎn)等待;
(7)spring.redis.pool.maxidle:連接池最大空閑連接,如果超過(guò)最大空閑連接數(shù),會(huì)將對(duì)象丟棄;
(8)spring.redis.pool.minidle:連接池最小空閑連接,如果小于最小空閑連接數(shù),會(huì)創(chuàng)建新的連接對(duì)象,以此來(lái)保持空閑連接數(shù)量大于等于最小空閑連接數(shù);
(9)spring.redis.timeout:連接超時(shí)時(shí)間。
3 實(shí)驗(yàn)結(jié)果及分析
本文通過(guò)采用RedisDesktopManager圖形化Redis管理工具來(lái)對(duì)實(shí)驗(yàn)結(jié)果進(jìn)行分析和研究。
如圖3所示,在db0這個(gè)數(shù)據(jù)庫(kù)中,有8個(gè)數(shù)據(jù)鍵,這8個(gè)數(shù)據(jù)鍵分別對(duì)應(yīng)8種不同類(lèi)別的圖片資源信息,如表1所列:
這樣,在獲取value1所對(duì)應(yīng)的值時(shí),只需要在后端通過(guò)鍵shopcategorylist_allfirstlevel,便可直接在Redis中獲取到值,而無(wú)需再次通過(guò)數(shù)據(jù)庫(kù)進(jìn)行查詢(xún)操作,極大程度上改善了系統(tǒng)的效率。將不使用Redis的傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)和采用Redis的數(shù)據(jù)庫(kù)進(jìn)行對(duì)比,會(huì)發(fā)現(xiàn)采用Redis有以下好處,如表2所列:
4 結(jié)語(yǔ)
基于Redis技術(shù)的分布式數(shù)據(jù)存儲(chǔ)方法,可以解決因數(shù)據(jù)量逐漸增大,用戶對(duì)相同數(shù)據(jù)訪問(wèn)的集中,而出現(xiàn)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)負(fù)擔(dān)加重,數(shù)據(jù)庫(kù)響應(yīng)效率低下,瀏覽器上響應(yīng)延遲等重大問(wèn)題。本文通過(guò)實(shí)驗(yàn)以及對(duì)比證實(shí)了可以利用緩存技術(shù)查找數(shù)據(jù),可以在一定程度上減少對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),同時(shí)加快Web等應(yīng)用的響應(yīng)速度,提高用戶體驗(yàn)感。
參考文獻(xiàn):
[1]寧方美,賀雪梅,牟晉娟.SpringBoot集成Redis緩存技術(shù)在企業(yè)一卡通系統(tǒng)中的應(yīng)用[J].電子技術(shù)與軟件工程,2019(24):133134.
[2]葉朋.網(wǎng)站訪問(wèn)性能優(yōu)化的研究與實(shí)現(xiàn)[D].哈爾濱理工大學(xué),2020.
[3]徐茂紅,王飛,張明.基于大數(shù)據(jù)量的Redis技術(shù)應(yīng)用與研究[J].信息技術(shù)與信息化,2019(11):228230.
[4]宋云奎,吳文鵬,趙磊,莫?jiǎng)Ψ?,黃俊濤.基于REDIS的分布式數(shù)據(jù)存儲(chǔ)方法[J].計(jì)算機(jī)產(chǎn)品與流通,2020(08):106.
[5]王偉晨.基于布隆過(guò)濾器算法的數(shù)據(jù)檢索誤判率研究[J].計(jì)算機(jī)產(chǎn)品與流通,2020(03):260261.
基金項(xiàng)目:遼寧科技大學(xué)大學(xué)生創(chuàng)新創(chuàng)業(yè)訓(xùn)練計(jì)劃資助項(xiàng)目(202010146482)遼寧科技大學(xué)優(yōu)秀人才項(xiàng)目(2018RC05)
作者簡(jiǎn)介:秦溧(2000—),男,重慶榮昌人,本科在讀生,軟件工程專(zhuān)業(yè)。
*通訊作者:艾青(1980—),男,漢族,遼寧遼陽(yáng)人,博士,副教授,碩士生導(dǎo)師,從事軟件工程、機(jī)器學(xué)習(xí)、人工智能研究。