Spring SpringMVC and redis
阿新 • • 發佈:2021-08-08
Spring框架可以解決物件建立以及物件之間依賴關係的一種框架。
spring的核心功能: IOC容器, 解決物件建立及依賴關係
Spring AOP切面程式設計
Spring bean初始化的三種方式
構造方法例項化bean
靜態工廠方式例項化bean
例項化工廠方法.
@Configuration是隨容器啟動開始載入的,始終存在的單例模式。 @Component是使用一次即例項化一次
1
什麼是SpringIOC
降低了元件之間的耦合性,解耦
IOC就是把每個bean與bean之間的關係交給第三方容器進行管理,這個容器就是Spring。
原理
控制反轉,通過依賴注入方式實現,IOC利用java反射機制(反射的目的是高內聚低耦合)
java 獲取反射常使用的三種方式:
1.通過new物件實現反射機制
2.通過路徑實現反射機制
3.通過類名實現反射機制
Spring bean宣告週期
例項化 設定依賴 初始化 spring容器進行管理銷燬前處理消亡
Spring中設計模式
spring中兩種代理方式若目標物件實現了若干介面,spring使用jdk代理,若沒有物件實現任何介面使用CGlib
單例模式 在spring中預設是單例
1
Spring事務
程式設計式事務管理 這種方式難維護
宣告式事務管理 業務程式碼和事務管理分離
2 什麼是SpringAOP
aop實現原理其實就是java的動態代理 ,但是jdk的動態代理必須實現介面,所以Spring的aop是Cglib這個庫實現的,cglib使用ASM這個直接操縱位元組碼框架 所以可以不實現介面完成動態代理
3IOC容器建立物件
1) 無引數構造器
2) 帶引數構造器
3) 工廠建立物件
Spring有幾種配置方式?
1.基於XML的配置
2.基於註解的配置
3.基於Java的配置
4Spring作用域
* singleton:單例模式,在整個Spring IoC容器中,使用singleton定義的Bean將只有一個例項
* prototype:原型模式,每次通過容器的getBean方法獲取prototype定義的Bean時,都將產生一個新的Bean例項
* request:對於每次HTTP請求,使用request定義的Bean都將產生一個新例項,即每次HTTP請求將會產生不同的Bean例項。只有在Web應用中使用Spring時,該作用域才有效
* session:對於每次HTTP Session,使用session定義的Bean豆漿產生一個新例項。同樣只有在Web應用中使用Spring時,該作用域才有效
* global session:每個全域性的HTTP Session,使用session定義的Bean都將產生一個新例項。典型情況下,僅在使用portlet context的時候有效。同樣只有在Web應用中使用Spring時,該作用域才有效
SpringMvc
1、什麼是Spring MVC ?簡單介紹下你對springMVC的理解?
SpringMvc 基於MVC設計模式的輕量級web框架,通過Model,view,Controller分離,將web層進行指責解耦,
SpringMvc是基於過濾器對servlet進行了封裝的一個框架,我們使用的時候就是在web.xml檔案中配置
SpringMvc工作原理?
客戶端傳送請求到DispatcherServlet
DispatcherServlet呼叫 handler Mapping 找到處理請求的 Controller
Controller 呼叫業務邏輯後,返回 ModelAndView
DispatcherServlet呼叫 ModelAndView,找到指定檢視結果返回到客戶端
Springmvc 執行流程是什麼?
使用者傳送請求至前端控制器DispatcherServlet;
DispatcherServlet收到請求後,呼叫HandlerMapping(處理器對映器),請求獲取Handle;
生成處理器物件及處理器攔截器(如果有則生成)一併返回給DispatcherServlet;
DispatcherServlet 呼叫 Handler Adapter處理器介面卡;
Handler Adapter將Handler執行結果ModelAndView返回給DispatcherServlet;
DispatcherServlet將ModelAndView傳給 View Resolver檢視解析器進行解析;
ViewResolver解析後返回具體View;
DispatcherServlet對View進行渲染檢視(即將模型資料填充至檢視中)
DispatcherServlet響應使用者。
4、SpringMVC怎麼樣設定重定向和轉發的?
(1)轉發:在返回值前面加"forward:",譬如"for ward:user.do?name=method4"
(2)重定向:在返回值前面加"redi rect:",譬如"redirect:http://www.baidu.com"
8、如何解決POST請求中文亂碼問題,GET的又如何處理呢?
(1)解決post請求亂碼問題:
在web.xml中配置一個CharacterEncodingFilter過濾器,設定成utf-8;
(2)get請求中文引數出現亂碼解決方法有兩個:
①修改tomcat配置檔案新增編碼與工程編碼一致,如下:
更簡便的方法,在伺服器端配置URL編碼格式:修改tomcat的配置檔案server.xml:
只需增加 URIEncoding=“UTF-8” 這一句,然後重啟tomcat即可。
9、Spring MVC的異常處理 ?
答:可以將異常拋給Spring框架,由Spring框架來處理;我們只需要配置簡單的異常處理器,在異常處理器中添檢視頁面即可。
10、SpringMvc的控制器是不是單例模式,如果是,有什麼問題,怎麼解決?
答:是單例模式,所以在多執行緒訪問的時候有執行緒安全問題,不要用同步,會影響效能的,解決方案是在控制器裡面不能寫欄位。
11、 SpringMVC常用的註解有哪些?
5
@RequestMapping:用於處理請求 url 對映的註解,可用於類或方法上。用於類上,則表示類中的所有響應請求的方法都是以該地址作為父路徑。
@RequestBody:註解實現接收http請求的json資料,將json轉換為java物件。
@Response Body:註解實現將conreoller方法返回物件轉化為json物件響應給客戶。
12. Springmvc 怎麼和AJAX相互呼叫的?
通過Jackson框架就可以把Java裡面的物件直接轉化成Js可以識別的Json物件。具體步驟如下 :
14.Springmvc 中系統如何分層 ?
系統分為表現層(UI):資料的展現,操作頁面,請求轉發。
業務層(服務層):封裝業務處理邏輯
持久層(資料訪問層):封裝資料訪問邏輯
Redis
redis的三種叢集方式
redis有三種叢集方式:主從複製,哨兵模式和叢集。
1 什麼是NOSQL?
NoSQL 是 Not Only SQL 的縮寫,意即"不僅僅是SQL"的意思,泛指非關係型的資料庫。
2
什麼是redis
Redis支援資料的持久化,可以將記憶體中的資料儲存在磁碟中,重啟的時候可以再次載入進行使用。
Redis不僅僅支援簡單的key-value型別的資料,同時還提供list,set,zset,hash等資料結構的儲存。
Redis支援資料的備份,即master-slave模式的資料備份。
3
Redis應用場景
主要能夠體現 解決資料庫的訪問壓力。
例如:簡訊驗證碼時間有效期、session共享解決方案
4
Redis優勢
效能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
原子 – Redis的所有操作都是原子性的,同時Redis還支援對幾個操作全並後的原子性執行。
豐富的特性 – Redis還支援 publish/subscribe, 通知, key 過期等等特性。
5
Redis的基本資料型別
字串(string),列表(list),無序集合(set),有序集合(zset)以及雜湊(hash)
6什麼是主從複製
redis的複製功能是支援多個數據庫之間的資料同步,一類是主資料庫(master)一類是從資料庫(slave),主資料庫可以進行讀寫操作,當發生寫操作的哦時候自動將資料同步到從資料庫
從資料庫一般只用來讀
7
什麼是哨兵機制
Redis的哨兵(sentinel) 系統用於管理多個 Redis 伺服器,該系統執行以下三個任務:
1 監控
哨兵會不斷地檢查你的Master和Slave是否運作正常
2提醒:
當被監控的某個 Redis出現問題時, 哨兵(sentinel) 可以通過 API 向管理員或者其他應用程式傳送通知。
3自動故障遷移(Automatic failover):
當一個Master不能正常工作時,哨兵(sentinel) 會開始一次自動故障遷移操作,它會將失效Master的其中一個Slave升級為新的Master, 並讓失效Master的其他Slave改為複製新的 Master; 當客戶端試圖連線失效的Master時,叢集也會向客戶端返回新Master的地址,使得叢集可以使用Master代替失效Master。
8
Redis持久化
rdb
一個子程序來進行持久化 會先講資料寫入到一個臨時檔案持久化過程結束 然後替換調之前的 臨時檔案
主程序不進行任何io操作確保了效能如果對資料大規模恢復 且對資料恢復的完成性不敏感 RDB比AOF 更高效
RDB缺點就是 最後一次持久化可能會丟失
RDB 儲存的dump.rdb檔案
15 分鐘 修改key 修改一次 就儲存
5 分鐘10次
11W次
aof
以日誌的形式 記錄每個寫的操作
只記寫不記讀
不可以改寫檔案
redis 重啟 就會根據日誌的命令 重寫執行一次
如果 這個檔案損壞
check aof修復[
aop缺點
越寫越多
重寫機制
第一次儲存20mb 第二次儲存到40mb 已經到達100
當aop大小超過 所設定的值redis就會啟動aop檔案的內容壓縮
使用過Redis分散式鎖麼,它是怎麼實現的?
先拿set nx來爭搶鎖,搶到之後,再用expire給鎖加一個過期時間防止鎖忘記了釋放。
如果在setnx之後執行expire之前程序意外crash或者要重啟維護了,那會怎麼樣?
set指令有非常複雜的引數,這個應該是可以同時把setnx和expire合成一條指令來用的!
什麼是快取穿透?如何避免?什麼是快取雪崩?何如避免?
快取穿透
一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢(比如DB)。一些惡意的請求會故意查詢不存在的資料,請求量很大,就會對後端系統造成很大的壓力。這就叫做快取穿透。
如何避免?有,
1:對查詢結果為空的情況也進行快取,快取時間設定短一點,或者該key對應的資料insert了之後清理快取。
2:對一定不存在的key進行過濾。
可以把所有的可能存在的key放到一個大的Bitmap中,查詢時通過該bitmap過濾。
快取雪崩
當快取伺服器重啟或者大量快取集中在某一個時間段失效,這樣在失效的時候,會給後端系統帶來很大壓力。導致系統崩潰。
如何避免?
1:在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許一個執行緒查詢資料和寫快取,其他執行緒等待。
2:做二級快取,A1為原始快取,A2為拷貝快取,A1失效時,可以訪問A2,A1快取失效時間設定為短期,A2設定為長期
3:不同的key,設定不同的過期時間,讓快取失效的時間點儘量均勻。
分散式鎖特性
不管使用什麼中介軟體,有幾點是實現分散式鎖必須要考慮到的。
1. 互斥:互斥好像是必須的,否則怎麼叫鎖。
2. 死鎖: 如果一個執行緒獲得鎖,然後掛了,並沒有釋放鎖,致使其他節點(執行緒)永遠無法獲取鎖,這就是死鎖。分散式鎖必須做到避免死鎖。
3. 效能: 高併發分散式系統中,執行緒互斥等待會成為效能瓶頸,需要好的中介軟體和實現來保證效能。
4. 鎖特性:考慮到複雜的場景,分散式鎖不能只是加鎖,然後一直等待。最好實現如Java Lock的一些功能如:鎖判斷,超時設定,可重入性等。
Redis實現之Redis son原理
redission實現了JDK中的Lock介面,所以使用方式一樣,只是Redssion的鎖是分散式的