Java應用開發(fā)(中、高級)課件 任務(wù)3.6 完成數(shù)據(jù)緩存實現(xiàn)_第1頁
Java應用開發(fā)(中、高級)課件 任務(wù)3.6 完成數(shù)據(jù)緩存實現(xiàn)_第2頁
Java應用開發(fā)(中、高級)課件 任務(wù)3.6 完成數(shù)據(jù)緩存實現(xiàn)_第3頁
Java應用開發(fā)(中、高級)課件 任務(wù)3.6 完成數(shù)據(jù)緩存實現(xiàn)_第4頁
Java應用開發(fā)(中、高級)課件 任務(wù)3.6 完成數(shù)據(jù)緩存實現(xiàn)_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

任務(wù)6.完成數(shù)據(jù)緩存實現(xiàn)任務(wù)描述Redis是一種高性能的非關(guān)系型數(shù)據(jù)庫。redis作用在內(nèi)存,性能極高。本任務(wù)首先安裝好Redis服務(wù),然后通過SpringBoot把Redis整合到項目中,然后編寫Redis緩存工具類實現(xiàn)用戶數(shù)據(jù)緩存提高系統(tǒng)性能。知識準備1.JWT介紹Jsonwebtoken(JWT),是為了在網(wǎng)絡(luò)應用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準((RFC7519).該token被設(shè)計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認證,也可被加密。2.JWT的token的認證和傳統(tǒng)的session認證的區(qū)別(1)傳統(tǒng)的session認證http協(xié)議本身是一種無狀態(tài)的協(xié)議,而這就意味著如果用戶向應用提供了用戶名和密碼來進行用戶認證,那么下一次請求時,用戶還要再一次進行用戶認證才行,因為根據(jù)http協(xié)議,應用并不能知道是哪個用戶發(fā)出的請求,所以為了讓應用能識別是哪個用戶發(fā)出的請求,只能在服務(wù)器存儲一份用戶登錄的信息,這份登錄信息會在響應時傳遞給瀏覽器,告訴其保存為cookie,以便下次請求時發(fā)送給應用,這樣應用就能識別請求來自哪個用戶了,這就是傳統(tǒng)的基于session認證。但是這種基于session的認證使應用本身很難得到擴展,隨著不同客戶端用戶的增加,獨立的服務(wù)器已無法承載更多的用戶,而這時候基于session認證應用的問題就會暴露出來.基于session認證所顯露的問題①Session:每個用戶經(jīng)過應用認證之后,應用都要在服務(wù)端做一次記錄,以方便用戶下次請求的鑒別,通常而言session都是保存在內(nèi)存中,而隨著認證用戶的增多,服務(wù)端的開銷會明顯增大。②擴展性:用戶認證之后,服務(wù)端做認證記錄,如果認證的記錄被保存在內(nèi)存中的話,這意味著用戶下次請求還必須要請求在這臺服務(wù)器上,這樣才能拿到授權(quán)的資源,這樣在分布式的應用上,相應的限制了負載均衡器的能力。這也意味著限制了應用的擴展能力。③CSRF:因為是基于cookie來進行用戶識別的,cookie如果被截獲,用戶就會很容易受到跨站請求偽造的攻擊。(2)基于token的鑒權(quán)機制基于token的鑒權(quán)機制類似于http協(xié)議也是無狀態(tài)的,它不需要在服務(wù)端去保留用戶的認證信息或者會話信息。這就意味著基于token認證機制的應用不需要去考慮用戶在哪一臺服務(wù)器登錄了,這就為應用的擴展提供了便利。流程上是這樣的:①用戶使用用戶名密碼來請求服務(wù)器②服務(wù)器進行驗證用戶的信息③服務(wù)器通過驗證發(fā)送給用戶一個token④客戶端存儲token,并在每次請求時附送上這個token值⑤服務(wù)端驗證token值,并返回數(shù)據(jù)這個token必須要在每次請求時傳遞給服務(wù)端,它應該保存在請求頭里,另外,服務(wù)端要支持CORS(跨來源資源共享)策略,一般在服務(wù)端這么做就可以了Access-Control-Allow-Origin:*。3.Redis介紹Redis是一個開源,先進的key-value存儲,并用于構(gòu)建高性能,可擴展的Web應用程序的完美解決方案。(1)Redis特點:①Redis數(shù)據(jù)庫完全在內(nèi)存中,使用磁盤僅用于持久性。②相比許多鍵值數(shù)據(jù)存儲,Redis擁有一套較為豐富的數(shù)據(jù)類型。--*③Redis可以將數(shù)據(jù)復制到任意數(shù)量的從服務(wù)器。(2)Redis優(yōu)勢介紹:①異常快速:Redis的速度非???,每秒能執(zhí)行約11萬集合,每秒約81000+條記錄。②支持豐富的數(shù)據(jù)類型:Redis支持最大多數(shù)開發(fā)人員已經(jīng)知道像列表,集合,有序集合,散列數(shù)據(jù)類型。這使得它非常容易解決各種各樣的問題,因為我們知道哪些問題是可以處理通過它的數(shù)據(jù)類型更好。③操作都是原子性:所有Redis操作是原子的,這保證了如果兩個客戶端同時訪問的Redis服務(wù)器將獲得更新后的值。④多功能實用工具:Redis是一個多實用的工具,可以在多個用例如緩存,消息,隊列使用(Redis原生支持發(fā)布/訂閱),任何短暫的數(shù)據(jù),應用程序,如Web應用程序會話,網(wǎng)頁命中計數(shù)等。任務(wù)實施步驟1:搭建Redis開發(fā)環(huán)境(1)下載并解壓Redis下載地址:/microsoftarchive/redis/releases/tag/win-3.2.100下載頁面,如圖4-34所示:圖4-34Redis下載頁面(2)運行Redis解壓到F:\Redis-x64-3.2.100雙擊運行F:\Redis-x64-3.2.100\redis-server.exe,默認啟動端口號為6379,啟動成功顯示,如圖4-35所示:圖4-35啟動Redis服務(wù)步驟2:實現(xiàn)用戶數(shù)據(jù)緩存(1)增加項目依賴修改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;/***緩存基本的對象,Integer、String、實體類等**@paramkey緩存的鍵值*@paramvalue緩存的值*@return緩存的對象*/public<T>ValueOperations<String,T>setCacheObject(Stringkey,Tvalue){ValueOperations<String,T>operation=redisTemplate.opsForValue();operation.set(key,value);returnoperation;}

/***緩存基本的對象,Integer、String、實體類等**@paramkey緩存的鍵值*@paramvalue緩存的值*@paramtimeout時間*@paramtimeUnit時間顆粒度*@return緩存的對象*/public<T>ValueOperations<String,T>setCacheObject(Stringkey,Tvalue,Integertimeout,TimeUnittimeUnit){ValueOperations<String,T>operation=redisTemplate.opsForValue();operation.set(key,value,timeout,timeUnit);returnoperation;}

/***獲得緩存的基本對象。**@paramkey緩存鍵值*@return緩存鍵值對應的數(shù)據(jù)*/public<T>TgetCacheObject(Stringkey){ValueOperations<String,T>operation=redisTemplate.opsForValue();returnoperation.get(key);}

/***刪除單個對象**@paramkey*/publicvoiddeleteObject(Stringkey){redisTemplate.delete(key);}

/***刪除集合對象**@paramcollection*/publicvoiddeleteObject(Collectioncollection){redisTemplate.delete(collection);}

/***緩存List數(shù)據(jù)**@paramkey緩存的鍵值*@paramdataList待緩存的List數(shù)據(jù)*@return緩存的對象*/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對象**@paramkey緩存的鍵值*@return緩存鍵值對應的數(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ù)的對象*/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;}/***獲得緩存的基本對象列表**@parampattern字符串前綴*@return對象列表*/publicCollection<String>keys(Stringpattern){returnredisTemplate.keys(pattern);}}(4)在“com.chinasofti.ordersys.model”包下修改UserInfo.java類并實現(xiàn)Serializable接口。?代碼如下:packagecom.chinasofti.ordersys.model;importjava.io.Serializable;publicclassUserInfoimplementsSerializable{//...}(5)在“com.chinasofti.ordersys.util.security”包下修改UserHandleUtils.java類并把HashMap替換為RedisCache實現(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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論