1. 程式人生 > 其它 >Spring SpringMVC and redis

Spring SpringMVC and redis

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的鎖是分散式的