版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
任務(wù)6.完成數(shù)據(jù)緩存實(shí)現(xiàn)任務(wù)描述Redis是一種高性能的非關(guān)系型數(shù)據(jù)庫。redis作用在內(nèi)存,性能極高。本任務(wù)首先安裝好Redis服務(wù),然后通過SpringBoot把Redis整合到項(xiàng)目中,然后編寫Redis緩存工具類實(shí)現(xiàn)用戶數(shù)據(jù)緩存提高系統(tǒng)性能。知識(shí)準(zhǔn)備1.JWT介紹Jsonwebtoken(JWT),是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)((RFC7519).該token被設(shè)計(jì)為緊湊且安全的,特別適用于分布式站點(diǎn)的單點(diǎn)登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認(rèn)證,也可被加密。2.JWT的token的認(rèn)證和傳統(tǒng)的session認(rèn)證的區(qū)別(1)傳統(tǒng)的session認(rèn)證http協(xié)議本身是一種無狀態(tài)的協(xié)議,而這就意味著如果用戶向應(yīng)用提供了用戶名和密碼來進(jìn)行用戶認(rèn)證,那么下一次請(qǐng)求時(shí),用戶還要再一次進(jìn)行用戶認(rèn)證才行,因?yàn)楦鶕?jù)http協(xié)議,應(yīng)用并不能知道是哪個(gè)用戶發(fā)出的請(qǐng)求,所以為了讓應(yīng)用能識(shí)別是哪個(gè)用戶發(fā)出的請(qǐng)求,只能在服務(wù)器存儲(chǔ)一份用戶登錄的信息,這份登錄信息會(huì)在響應(yīng)時(shí)傳遞給瀏覽器,告訴其保存為cookie,以便下次請(qǐng)求時(shí)發(fā)送給應(yīng)用,這樣應(yīng)用就能識(shí)別請(qǐng)求來自哪個(gè)用戶了,這就是傳統(tǒng)的基于session認(rèn)證。但是這種基于session的認(rèn)證使應(yīng)用本身很難得到擴(kuò)展,隨著不同客戶端用戶的增加,獨(dú)立的服務(wù)器已無法承載更多的用戶,而這時(shí)候基于session認(rèn)證應(yīng)用的問題就會(huì)暴露出來.基于session認(rèn)證所顯露的問題①Session:每個(gè)用戶經(jīng)過應(yīng)用認(rèn)證之后,應(yīng)用都要在服務(wù)端做一次記錄,以方便用戶下次請(qǐng)求的鑒別,通常而言session都是保存在內(nèi)存中,而隨著認(rèn)證用戶的增多,服務(wù)端的開銷會(huì)明顯增大。②擴(kuò)展性:用戶認(rèn)證之后,服務(wù)端做認(rèn)證記錄,如果認(rèn)證的記錄被保存在內(nèi)存中的話,這意味著用戶下次請(qǐng)求還必須要請(qǐng)求在這臺(tái)服務(wù)器上,這樣才能拿到授權(quán)的資源,這樣在分布式的應(yīng)用上,相應(yīng)的限制了負(fù)載均衡器的能力。這也意味著限制了應(yīng)用的擴(kuò)展能力。③CSRF:因?yàn)槭腔赾ookie來進(jìn)行用戶識(shí)別的,cookie如果被截獲,用戶就會(huì)很容易受到跨站請(qǐng)求偽造的攻擊。(2)基于token的鑒權(quán)機(jī)制基于token的鑒權(quán)機(jī)制類似于http協(xié)議也是無狀態(tài)的,它不需要在服務(wù)端去保留用戶的認(rèn)證信息或者會(huì)話信息。這就意味著基于token認(rèn)證機(jī)制的應(yīng)用不需要去考慮用戶在哪一臺(tái)服務(wù)器登錄了,這就為應(yīng)用的擴(kuò)展提供了便利。流程上是這樣的:①用戶使用用戶名密碼來請(qǐng)求服務(wù)器②服務(wù)器進(jìn)行驗(yàn)證用戶的信息③服務(wù)器通過驗(yàn)證發(fā)送給用戶一個(gè)token④客戶端存儲(chǔ)token,并在每次請(qǐng)求時(shí)附送上這個(gè)token值⑤服務(wù)端驗(yàn)證token值,并返回?cái)?shù)據(jù)這個(gè)token必須要在每次請(qǐng)求時(shí)傳遞給服務(wù)端,它應(yīng)該保存在請(qǐng)求頭里,另外,服務(wù)端要支持CORS(跨來源資源共享)策略,一般在服務(wù)端這么做就可以了Access-Control-Allow-Origin:*。3.Redis介紹Redis是一個(gè)開源,先進(jìn)的key-value存儲(chǔ),并用于構(gòu)建高性能,可擴(kuò)展的Web應(yīng)用程序的完美解決方案。(1)Redis特點(diǎn):①Redis數(shù)據(jù)庫完全在內(nèi)存中,使用磁盤僅用于持久性。②相比許多鍵值數(shù)據(jù)存儲(chǔ),Redis擁有一套較為豐富的數(shù)據(jù)類型。--*③Redis可以將數(shù)據(jù)復(fù)制到任意數(shù)量的從服務(wù)器。(2)Redis優(yōu)勢介紹:①異??焖伲篟edis的速度非???,每秒能執(zhí)行約11萬集合,每秒約81000+條記錄。②支持豐富的數(shù)據(jù)類型:Redis支持最大多數(shù)開發(fā)人員已經(jīng)知道像列表,集合,有序集合,散列數(shù)據(jù)類型。這使得它非常容易解決各種各樣的問題,因?yàn)槲覀冎滥男﹩栴}是可以處理通過它的數(shù)據(jù)類型更好。③操作都是原子性:所有Redis操作是原子的,這保證了如果兩個(gè)客戶端同時(shí)訪問的Redis服務(wù)器將獲得更新后的值。④多功能實(shí)用工具:Redis是一個(gè)多實(shí)用的工具,可以在多個(gè)用例如緩存,消息,隊(duì)列使用(Redis原生支持發(fā)布/訂閱),任何短暫的數(shù)據(jù),應(yīng)用程序,如Web應(yīng)用程序會(huì)話,網(wǎng)頁命中計(jì)數(shù)等。任務(wù)實(shí)施步驟1:搭建Redis開發(fā)環(huán)境(1)下載并解壓Redis下載地址:/microsoftarchive/redis/releases/tag/win-3.2.100下載頁面,如圖4-34所示:圖4-34Redis下載頁面(2)運(yùn)行Redis解壓到F:\Redis-x64-3.2.100雙擊運(yùn)行F:\Redis-x64-3.2.100\redis-server.exe,默認(rèn)啟動(dòng)端口號(hào)為6379,啟動(dòng)成功顯示,如圖4-35所示:圖4-35啟動(dòng)Redis服務(wù)步驟2:實(shí)現(xiàn)用戶數(shù)據(jù)緩存(1)增加項(xiàng)目依賴修改pom.xml文件,增加下列依賴配置:<!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
<!--springboot集成redis所需common-pool2--><dependency><groupId>mons</groupId><artifactId>commons-pool2</artifactId><version>2.5.0</version></dependency>(2)增加redis配置修改src/main/resources/application.yml文件,在spring屬性下增加redis配置:spring:redis:database:0host:port:6379timeout:2000lettuce:pool:max-active:8max-wait:-1max-idle:8min-idle:0(3)在“com.chinasofti.ordersys.util”包下創(chuàng)建RedisCache.java工具類。?代碼如下:packagecom.chinasofti.ordersys.util;
importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.*;importorg.springframework.stereotype.Component;
importjava.util.*;importjava.util.concurrent.TimeUnit;
/***springredis工具類**/@SuppressWarnings(value={"unchecked","rawtypes"})@ComponentpublicclassRedisCache{@AutowiredpublicRedisTemplateredisTemplate;/***緩存基本的對(duì)象,Integer、String、實(shí)體類等**@paramkey緩存的鍵值*@paramvalue緩存的值*@return緩存的對(duì)象*/public<T>ValueOperations<String,T>setCacheObject(Stringkey,Tvalue){ValueOperations<String,T>operation=redisTemplate.opsForValue();operation.set(key,value);returnoperation;}
/***緩存基本的對(duì)象,Integer、String、實(shí)體類等**@paramkey緩存的鍵值*@paramvalue緩存的值*@paramtimeout時(shí)間*@paramtimeUnit時(shí)間顆粒度*@return緩存的對(duì)象*/public<T>ValueOperations<String,T>setCacheObject(Stringkey,Tvalue,Integertimeout,TimeUnittimeUnit){ValueOperations<String,T>operation=redisTemplate.opsForValue();operation.set(key,value,timeout,timeUnit);returnoperation;}
/***獲得緩存的基本對(duì)象。**@paramkey緩存鍵值*@return緩存鍵值對(duì)應(yīng)的數(shù)據(jù)*/public<T>TgetCacheObject(Stringkey){ValueOperations<String,T>operation=redisTemplate.opsForValue();returnoperation.get(key);}
/***刪除單個(gè)對(duì)象**@paramkey*/publicvoiddeleteObject(Stringkey){redisTemplate.delete(key);}
/***刪除集合對(duì)象**@paramcollection*/publicvoiddeleteObject(Collectioncollection){redisTemplate.delete(collection);}
/***緩存List數(shù)據(jù)**@paramkey緩存的鍵值*@paramdataList待緩存的List數(shù)據(jù)*@return緩存的對(duì)象*/public<T>ListOperations<String,T>setCacheList(Stringkey,List<T>dataList){ListOperationslistOperation=redisTemplate.opsForList();if(null!=dataList){intsize=dataList.size();for(inti=0;i<size;i++){listOperation.leftPush(key,dataList.get(i));}}returnlistOperation;}/***獲得緩存的list對(duì)象**@paramkey緩存的鍵值*@return緩存鍵值對(duì)應(yīng)的數(shù)據(jù)*/public<T>List<T>getCacheList(Stringkey){List<T>dataList=newArrayList<T>();ListOperations<String,T>listOperation=redisTemplate.opsForList();Longsize=listOperation.size(key);
for(inti=0;i<size;i++){dataList.add(listOperation.index(key,i));}returndataList;}
/***緩存Set**@paramkey緩存鍵值*@paramdataSet緩存的數(shù)據(jù)*@return緩存數(shù)據(jù)的對(duì)象*/public<T>BoundSetOperations<String,T>setCacheSet(Stringkey,Set<T>dataSet){BoundSetOperations<String,T>setOperation=redisTemplate.boundSetOps(key);Iterator<T>it=dataSet.iterator();while(it.hasNext()){setOperation.add(it.next());}returnsetOperation;}
/***獲得緩存的set**@paramkey*@return*/public<T>Set<T>getCacheSet(Stringkey){Set<T>dataSet=newHashSet<T>();BoundSetOperations<String,T>operation=redisTemplate.boundSetOps(key);dataSet=operation.members();returndataSet;}/***緩存Map**@paramkey*@paramdataMap*@return*/public<T>HashOperations<String,String,T>setCacheMap(Stringkey,Map<String,T>dataMap){HashOperationshashOperations=redisTemplate.opsForHash();if(null!=dataMap){for(Map.Entry<String,T>entry:dataMap.entrySet()){hashOperations.put(key,entry.getKey(),entry.getValue());}}returnhashOperations;}
/***獲得緩存的Map**@paramkey*@return*/public<T>Map<String,T>getCacheMap(Stringkey){Map<String,T>map=redisTemplate.opsForHash().entries(key);returnmap;}/***獲得緩存的基本對(duì)象列表**@parampattern字符串前綴*@return對(duì)象列表*/publicCollection<String>keys(Stringpattern){returnredisTemplate.keys(pattern);}}(4)在“com.chinasofti.ordersys.model”包下修改UserInfo.java類并實(shí)現(xiàn)Serializable接口。?代碼如下:packagecom.chinasofti.ordersys.model;importjava.io.Serializable;publicclassUserInfoimplementsSerializable{//...}(5)在“com.chinasofti.ordersys.util.security”包下修改UserHandleUtils.java類并把HashMap替換為RedisCache實(shí)現(xiàn)用戶數(shù)據(jù)緩存。?代碼如下:packagecom.chinasofti.ordersys.util.security;
importmon.security.LoginUser;importcom.chinasofti.ordersys.util.RedisCache;
importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;@Compo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024月子中心產(chǎn)后康復(fù)與美容護(hù)膚服務(wù)合同范本3篇
- 2025年桉樹苗木綠色種植與可持續(xù)發(fā)展合同2篇
- 2024無人機(jī)買賣合同協(xié)議
- 專業(yè)委托經(jīng)營協(xié)作合同(2024年版)版B版
- 2024外墻涂料施工質(zhì)量責(zé)任保險(xiǎn)合同范本3篇
- 專業(yè)勞務(wù)分包協(xié)議范本(2024)版B版
- 2025年金融科技參股合作合同書樣本2篇
- 2024年度新能源汽車充電設(shè)施投資建設(shè)合同3篇
- 2024年網(wǎng)絡(luò)游戲虛擬物品銷售合同
- 2024文藝巡回演出項(xiàng)目風(fēng)險(xiǎn)管理與服務(wù)保障合同3篇
- 上海教育出版社 藝術(shù) 八年級(jí)上冊(cè)第三單元 鄉(xiāng)音鄉(xiāng)韻 京腔京韻系鄉(xiāng)情 教學(xué)設(shè)計(jì)
- 人教版(2024新教材)七年級(jí)上冊(cè)數(shù)學(xué)第一章《有理數(shù)》單元測試卷(含答案)
- 商業(yè)倫理與企業(yè)社會(huì)責(zé)任(山東財(cái)經(jīng)大學(xué))智慧樹知到期末考試答案章節(jié)答案2024年山東財(cái)經(jīng)大學(xué)
- (正式版)QBT 8006-2024 年糕 標(biāo)準(zhǔn)
- 課堂教學(xué)能力提升(課堂PPT)
- vienna整流器交錯(cuò)并聯(lián)三相pfc電路
- 標(biāo)準(zhǔn)活動(dòng)板房設(shè)計(jì)說明(共7頁)
- 哈爾濱師范大學(xué)與堪培拉大學(xué)合作培養(yǎng)
- 重慶市永川區(qū)城鄉(xiāng)總體規(guī)劃
- 復(fù)旦大學(xué)新聞傳播學(xué)考博真題
- IEC60335-1(中文)
評(píng)論
0/150
提交評(píng)論