JAVA初中级面试题总纲(含答案)
(標(biāo)黑粗體為重點)
1.get和post的請求方式的區(qū)別?
NO.1、url可見性:
get,參數(shù)url可見;
post,url參數(shù)不可見
NO.2、數(shù)據(jù)傳輸上:
get,通過拼接url進行傳遞參數(shù);
post,通過body體傳輸參數(shù)
NO.3、緩存性:
get請求是可以緩存的
post請求不可以緩存
NO.4、后退頁面的反應(yīng):
get請求頁面后退時,不產(chǎn)生影響
post請求頁面后退時,會重新提交請求
NO.5、傳輸數(shù)據(jù)的大小:
get一般傳輸數(shù)據(jù)大小不超過2k-4k(根據(jù)瀏覽器不同,限制不一樣,但相差不大)
而post請求傳輸數(shù)據(jù)的大小根據(jù)php.ini 配置文件設(shè)定,也可以無限大。
NO.6、安全性:
這個也是最不好分析的,原則上post肯定要比get安全,畢竟傳輸參數(shù)時url不可見,但也擋不住部分人閑的沒事在那抓包玩。安全性個人覺得是沒多大區(qū)別的,防君子不防小人就是這個道理。對傳遞的參數(shù)進行加密,其實都一樣。
2.多線程:
NO.1 創(chuàng)建線程有幾種方式?(重點)
1. 繼承Thread類,可以直接調(diào)用Thread類的方法,使用方便,但是不能再繼承別的類,可擴展性較差。
2. 實現(xiàn)Runable接口,不能直接調(diào)用Thread類的方法,但是還可以繼承其他類,可擴展性較強;而且Runable接口是多線程的最高父類接口,主要是用來封裝任務(wù)的,Thread類也是通過實現(xiàn)Runable接口來實現(xiàn)的。
3. 實現(xiàn)Callable接口,同上。
4. 還可以通過線程池創(chuàng)建。
NO.2 繼承Thread類和實現(xiàn)Runable接口方式區(qū)別?(常問)
? 1、java是單繼承,繼承Thread后不能繼承別的類,有局限性,但是java可以多實現(xiàn),通過實現(xiàn)Runabel接口后還可以實現(xiàn)別的接口,可以**間接實現(xiàn)多繼承
2.Runable接口是多線程中的上帝,主要就是用來封裝任務(wù),Thread類也是通過實現(xiàn)它而來;
? 3、使用Runable接口可以很方便對共享資源進行傳入;
NO.3 線程狀態(tài)有幾種?(常問,一般答出幾種狀態(tài)即可)
1.新建(new):新建了一個線程,但是還沒有調(diào)用開啟線程的start()方法;
?2.可運行(runable):調(diào)用了開啟線程的start()方法,但是還沒有獲得到CPU的執(zhí)行權(quán),處于等待獲取執(zhí)行權(quán)狀態(tài);
3.?運行(running):已經(jīng)獲得到了CPU執(zhí)行權(quán),并處于正常執(zhí)行狀態(tài);
?4.死亡(dead):線程run()、main() 方法執(zhí)行結(jié)束,或者因異常退出了run()方法,則該線程結(jié)束生命周期。死亡的線程不可再次復(fù)生。
5.? 阻塞(blocked):這種狀態(tài)是指處于運行狀態(tài)時因為某種原因放棄了使用CPU執(zhí)行權(quán),暫時停止了運行,需要后續(xù)某些操作后方可再次進入可運行狀態(tài),?進而才有機會再次轉(zhuǎn)到運行狀態(tài),一般阻塞情況分三種(了解即可):
(一).等待阻塞 :運行(running)的線程執(zhí)行o.wait()方法,JVM會把該線程放入等待隊列(waitting queue)中,當(dāng)別的線程執(zhí)行了notify或者?notifyAll后可對其進行喚醒進入鎖池,讓該線程處于搶鎖狀態(tài),進而有機會重新轉(zhuǎn)入可運行(runnable)狀態(tài)。
?(二). 同步阻塞:運行(running)的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池(lock pool)中。
?(三). 其他阻塞:運行(running)的線程執(zhí)行Thread.sleep(long ms)或t.join()方法,或者發(fā)出了I/O請求時,JVM會把該線程置為阻塞狀態(tài)。
?當(dāng)sleep()狀態(tài)超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉(zhuǎn)入可運行(runnable)狀態(tài)。
NO.4 多線程中的 run()和 start()區(qū)別 ?
run()方法它其實只是一個封裝任務(wù)的普通方法,調(diào)用run()并不會開啟線程,start()方法會開啟線程,底層會調(diào)用run()方法。
NO.5?wait()與 sleep()的區(qū)別?(了解)
1、調(diào)用對象不同:wait()、notify()、notifyAll()等都是 Object 上的方法,任何對象都可以作為鎖對象進行調(diào)用;?sleep()、join()、yield()、interrupted()等都是屬于Thread類的靜態(tài)方法;
? 2、是否釋放鎖:sleep()方法不會釋放鎖,只讓出了CPU執(zhí)行權(quán),但是wait()會釋放鎖,而且會加入到等待隊列中。
? 3、使用位置:sleep()方法可以在任何地方使用;wait()方法則只能在synchronized同步方法或同步塊中使用;
? 4、重運行機制:sleep()過了指定睡眠時間從阻塞狀態(tài)自動回到可運行狀態(tài),wait()方法需要手動調(diào)用notify()或者notifyAll()方法手動進行喚醒,然后進入鎖池等待。
NO.6 什么情況下需要進行線程同步?
多個線程操作共享資源,會造成共享資源安全問題場景下。
3、多線程鎖相關(guān):(常問)
NO.1 Sychronized是公平鎖還是非公平鎖?(常問)
非公平!
NO.2 Synchronized 1.6之后做了哪些優(yōu)化?
? 自適應(yīng)的CAS自旋、鎖消除、鎖粗化、偏向鎖、輕量級鎖
NO.3 鎖有哪些用法?鎖對象分別是什么?(常問)
? 1、同步代碼塊:鎖對象為括號中的對象
? 2、同步方法:鎖對象為當(dāng)前對象 this
? 3、靜態(tài)同步方法:鎖對象為class字節(jié)碼文件對象
NO.4 什么是AQS? ??什么是CAS?
AQS:
java.util.concurrent.locks.AbstractQueuedSynchronizer?抽象類,簡稱 AQS ,是一個用于構(gòu)建鎖和同步容器的隊列同步器,它是整個JUC包下Lock體系的核心,如ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore都是基于它來實現(xiàn)的,它 解決了在實現(xiàn)同步容器時設(shè)計的大量細節(jié)問題,它的核心構(gòu)成部分為:使用一個 先進先出的FIFO 的隊列存儲排隊等待鎖的線程,使用一個用volatile修飾的int類型的state同步狀態(tài)來記錄?當(dāng)前是否有線程持有鎖**,0表示沒有線程獲得鎖,1表示有,上鎖state就加1,釋放鎖就對應(yīng)減1,有重入鎖現(xiàn)象,這個值就大于1,然后需要逐級去釋放。
CAS:(常問)
CAS其實就是樂觀鎖的一種實現(xiàn)方式,而悲觀鎖比較典型的就是Java中的synchronized。
CAS全稱compare and swap—就是? "比較并替換",保證對數(shù)據(jù)更改的原子性,它是并發(fā)條件下修改數(shù)據(jù)的一種機制,然后它還有三個操作數(shù):
> 需要修改的數(shù)據(jù)的內(nèi)存地址(V);
? > 對這個數(shù)據(jù)的舊預(yù)期值(A);
? > 需要將它修改為的值(B);
CAS的操作步驟如下:
1、修改前記錄數(shù)據(jù)的內(nèi)存地址V;
2、讀取數(shù)據(jù)的當(dāng)前的值,記錄為A;
3、需要修改值時查看地址V下的值是否仍然為A,若為A,則用B替換它;若地址V下的值不為A,表示在自己修改的過程中,其他的線程對數(shù)據(jù)進行了修改,則不更新變量的值,而是重新從步驟2開始執(zhí)行,這被稱為自旋;
總結(jié):CAS 就是貫穿于整個AQS體系,是AQS實現(xiàn)的基礎(chǔ)。
4. 框架系列:
<Springboot>
N0.1 springboot提供了哪些核心功能?
1. 獨立運行 Spring 項目Spring Boot 可以以 jar 包形式獨立運行,運行一個 Spring Boot 項目只需要通過 java -jar xx.jar 來運行。
2. 內(nèi)嵌 Servlet 容器
? Spring Boot 可以選擇內(nèi)嵌 Tomcat、Jetty 或者 Undertow,這樣我們無須以 war 包形式部署項目。
? 第 2 點是對第 1 點的補充,因為在 Spring Boot 未出來的時候,大多數(shù) Web 項目,是打包成 war 包,部署到 Tomcat、Jetty 等容器。
3. 提供 Starter 簡化 Maven 配置Spring 提供了一系列的 starter pom 來簡化 Maven 的依賴加載。
4. 自動配置 Spring Bean:Spring Boot 檢測到特定類的存在,就會針對這個應(yīng)用做一定的配置,進行自動配置 Bean ,這樣會極大地減少我們要使用的配置。
5. 無代碼生成和 XML 配置**:Spring Boot 沒有引入任何形式的代碼生成,它是使用的 Spring 4.0 的條件 @Condition 注解以實現(xiàn)根據(jù)條件進行配置。
NO.2? Spring Boot 和 Spring MVC 和 Spring 有什么區(qū)別?
?Spring 的完整名字,是 Spring Framework 。它提供了多個模塊,Spring IoC、Spring AOP、Spring MVC 等等。所以,Spring MVC 是 Spring Framework
? 眾多模塊中的一個。而 Spring Boot 是構(gòu)造在 Spring Framework(Spring) 之上的 Boot 啟動器,旨在更容易的配置一個 Spring 項目。
<SpringCloud>
NO.3?什么是SpringCloud?
首先SpringCloud是一款微服務(wù)框架 可以說是目前微服務(wù)架構(gòu)的最好的選擇,涵蓋了基本我們需要的所有組件,所以也被稱為全家桶,? Spring Cloud 是構(gòu)建在 Spring Boot 基礎(chǔ)之上,用于快速構(gòu)建分布式系統(tǒng)的通用模式的工具集。或者說,換成大家更為熟知的,用于構(gòu)建微服務(wù)的技術(shù)棧。
NO.4?Spring Cloud 主要提供了哪些功能?(如果英文太長,記住中文名字即可)
-
Distributed/versioned configuration 分布式/版本化的配置管理
-
Service registration and discovery 服務(wù)注冊與服務(wù)發(fā)現(xiàn)
-
Routing 路由
-
Service-to-service calls 端到端的調(diào)用
-
Load balancing 負載均衡
-
Circuit Breakers 斷路器
-
Global locks 全局鎖
-
Leadership election and cluster state 選舉與集群狀態(tài)管理
-
Distributed messaging 分布式消息
NO.5?Spring Cloud 有哪些組件?
Spring Cloud的 組件相當(dāng)繁雜,擁有諸多子項目。如下腦圖所示:
?我們最為熟知的,就是 Spring Cloud Netflix ,它是 Netflix 公司基于它們自己的 Eureka、Hystrix、Zuul、Ribbon 等組件,構(gòu)建的一個 Spring Cloud 實現(xiàn)技術(shù)棧。
雖然Spring Cloud的組件很多,但是開發(fā)中常用的五大組件還是要記住:
SpringCloud常用的五大組件(重點):
| 組件 | 組件名 | 作用 | |
| 注冊中心 | Nacos | 作用:實現(xiàn)服務(wù)治理(服務(wù)注冊與發(fā)現(xiàn)) 簡介:Spring Cloud Eureka是Spring Cloud Netflix項目下的服務(wù)治理模塊。 由兩個組件組成:Eureka服務(wù)端和Eureka客戶端。 Eureka服務(wù)端用作服務(wù)注冊中心。支持集群部署。 Eureka客戶端是一個java客戶端,用來處理服務(wù)注冊與發(fā)現(xiàn)。 在應(yīng)用啟動時,Eureka客戶端向服務(wù)端注冊自己的服務(wù)信息,同時將服務(wù)端的服務(wù)信息緩存到本地。客戶端會和服務(wù)端周期性的進行心跳交互,以更新服務(wù)租約和服務(wù)信息。 | |
| 熔斷器 | Hystrix | 作用:斷路器,保護系統(tǒng),控制故障范圍。 簡介:為了保證其高可用,單個服務(wù)通常會集群部署。由于網(wǎng)絡(luò)原因或者自身的原因,服務(wù)并不能保證100%可用,如果單個服務(wù)出現(xiàn)問題,調(diào)用這個服務(wù)就會出現(xiàn)線程阻塞,此時若有大量的請求涌入,Servlet容器的線程資源會被消耗完畢,導(dǎo)致服務(wù)癱瘓。服務(wù)與服務(wù)之間的依賴性,故障會傳播,會對整個微服務(wù)系統(tǒng)造成災(zāi)難性的嚴重后果,這就是服務(wù)故障的“雪崩”效應(yīng)。 | |
| 網(wǎng)關(guān) | Zuul | 作用:api網(wǎng)關(guān),路由,負載均衡等多種作用 類似nginx,反向代理的功能,不過netflix自己增加了一些配合其他組件的特性。 在微服務(wù)架構(gòu)中,后端服務(wù)往往不直接開放給調(diào)用端,而是通過一個API網(wǎng)關(guān)根據(jù)請求的url,路由到相應(yīng)的服務(wù)。當(dāng)添加API網(wǎng)關(guān)后,在第三方調(diào)用端和服務(wù)提供方之間就創(chuàng)建了一面墻,這面墻直接與調(diào)用方通信進行權(quán)限控制,后將請求均衡分發(fā)給后臺服務(wù)端。 | |
| 負載均衡 | Ribbon | spring-cloud-loadbalancerSpring Cloud Ribbon是一個基于HTTP和TCP的客戶端負載均衡工具,它基于Netflix Ribbon實現(xiàn)。通過Spring Cloud的封裝,可以讓我們輕松地將面向服務(wù)的REST模版請求自動轉(zhuǎn)換成客戶端負載均衡的服務(wù)調(diào)用。spring-cloud-loadbalancer | |
| 服務(wù)調(diào)用 | Feign | 作用:服務(wù)調(diào)用 簡介:Feign是一個聲明式WebService客戶端。使用Feign能讓編寫Web Service客戶端更加簡單,它的使用方法就是定義一個接口,然后在上面添加注解,同時也支持JAX-RS標(biāo)準(zhǔn)的注解。Feign也支持可插拔式的編碼器和解碼器。SpringCloud對Feign進行了封裝,使其支持了Spring MVC標(biāo)準(zhǔn)注解和HttpMessageConverters。Feign可以與Eureka和Ribbon組合使用以支持負載均衡。 |
NO.6 Spring Cloud 和 Spring Boot 的區(qū)別和關(guān)系?(以下三點:)
Spring Boot 專注于快速方便的開發(fā)單個個體微服務(wù)。
Spring Cloud 是關(guān)注全局的微服務(wù)協(xié)調(diào)整理治理框架以及一整套的落地解決方案,它將 Spring Boot 開發(fā)的一個個單體微服務(wù)整合并管理起來,為各個微服務(wù)之間提供:配置管理,服務(wù)發(fā)現(xiàn),斷路器,路由,微代理,事件總線等的集成服務(wù)。
Spring Boot 可以離開 Spring Cloud 獨立使用,但是 Spring Cloud 離不開 Spring Boot ,屬于依賴的關(guān)系。
總結(jié):
-
Spring Boot 專注于快速,方便的開發(fā)單個微服務(wù)個體。
-
Spring Cloud 關(guān)注全局的服務(wù)治理框架。
5.數(shù)據(jù)庫(MySQL) :
NO.1什么是索引(Index)?
? 本質(zhì)上是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),MySql中主要應(yīng)用的索引數(shù)據(jù)結(jié)構(gòu)為B+Tree。
NO.2??索引結(jié)構(gòu)類型有哪些?
Mysql存儲引擎主要有MySIAM、InnoDB。?而各種存儲引擎對索引的支持也各不相同,因此MySQL數(shù)據(jù)庫支持多種索引類型,如BTree索引,哈希索引,全文索引等等
NO.3 存儲數(shù)據(jù)結(jié)構(gòu)?
? MySIAM、InnoDB兩種存儲引擎都是基于B+樹數(shù)據(jù)結(jié)構(gòu)存儲表數(shù)據(jù)的。不同之處是:
? MySIAM的B+樹只存儲了索引key值地址,真正的數(shù)據(jù)存儲在別的地方
InnoDB 存儲引擎中的B+樹既存儲了索引也存儲了數(shù)據(jù)
NO.4 什么是聚集索引、非聚集索引?
1.聚集索引:
又叫主鍵索引,是指數(shù)據(jù)庫表行中數(shù)據(jù)的物理存儲順序與數(shù)據(jù)的邏輯順序相同,一張表中只允許存在一個聚集索引,對于mysql來說一般就是主鍵,若無主鍵則為表中第一個非空的唯一索引,還是沒有,就采用InnoDB存儲引擎為每行數(shù)據(jù)內(nèi)置的ROWID 作為聚集索引 ;
(擴展部分:)聚集索引就是按照每張表的主鍵構(gòu)造一顆B+樹,同時葉子節(jié)點中存放的即為整張表的記錄數(shù)據(jù)。
聚集索引的葉子節(jié)點稱為數(shù)據(jù)頁,聚集索引的這個特性決定了索引組織表中的數(shù)據(jù)也是索引的一部分。
2.非聚集索引:
又叫輔助索引、二級索引。是指除了聚集索引外的其他索引,該索引中索引的邏輯順序與磁盤上行的物理存儲順序不同,一個表中可以擁有多個非聚集索引。數(shù)據(jù)的邏輯順序可能相鄰,但是數(shù)據(jù)的實際存儲物理地址可能相差十萬八千里 ;?非聚集索引的葉子節(jié)點存儲主鍵
3.覆蓋索引(了解):
這個概念就是指select的數(shù)據(jù)列只用從索引中就能夠取得,不必從聚集索引中的葉子結(jié)點數(shù)據(jù)項中讀取,換句話說查詢列要被所使用的索引覆蓋。 索引是高效找到行的一 個方法,當(dāng)能通過檢索 索引就可以讀取想要的數(shù)據(jù),那就不需要再到數(shù)據(jù)表中讀取行了。如果一個索引包含了(或覆蓋了)滿足查詢語句中字段與條件的數(shù)據(jù)就叫做覆蓋索引。在mysql中只能使用BTree索引做覆蓋索引、Hash索引不行 如果實現(xiàn)了覆蓋索引,在explain的Extra列可以看到“Using index”的信息
NO.5 mysql優(yōu)化:
1.優(yōu)化SQL語句層面(理解透徹):
1、?盡量避免使用select *;
2、規(guī)范sql語句大小寫,sql是有緩存的,避免每次都需要解析;
?3、使用exsits代替in,要更高效;
?4、mysql sql解析執(zhí)行過程從右至左,基于這個規(guī)則,from后面能過濾掉更多數(shù)據(jù)的基礎(chǔ)表放后面,where后面能過濾掉更多數(shù)據(jù)的查詢條件放后面;
?5、查詢條件中用相同類型去查詢,比如避免數(shù)值列用字符串查詢條件;
?6、合理使用索引(
????????????????1、為合適的列添加索引(主鍵、唯一索引、組合索引);
? ? ? ? ?? ??? ?2、盡量建立聯(lián)合索引,也省空間成本;
? ? ? ? ?? ??? ?3、盡量使用覆蓋索引;
? ? ? ? ?? ??? ?3、避免以下會使索引失效的操作(了解大概即可):
? ? ? ? ? ? ? ? ? ? (1)、索引列有null值不走索引
? ? ? ? ? ? ? ? ? ? (2)、使用is null或is not null不走索引
? ? ? ? ? ? ? ? ? ? (3)、各種負向查詢not ,not in, not like ,<> ,!= ,!> ,!< ?不會使用索引
? ? ? ? ? ? ? ? ? ? (4)、like將%放左邊不走索引
? ? ? ? ? ? ? ? ? ? (5)、查詢條件的數(shù)據(jù)類型做了隱式轉(zhuǎn)換
? ? ? ? ? ? ? ? ? ? (6)、使用in或union代替or,or兩側(cè)有非索引列就不會走索引
? ? ? ? ? ? ? ? ? ? (7)、盡量保持索引列干凈,不在索引列上使用函數(shù)轉(zhuǎn)換、運算
? ? ? ? ? ? ? ? ? ? (8)、聯(lián)合索引要遵循最左匹配原則,如建立聯(lián)合索引(A,B,C),查詢順序如下:
? ? ?ABC會走索引,AB會走索引,A也會走索引,但是不能斷開 如AC|CA|BC|CB|B|C都不會走索引
? ? ? ? ? ? ? ? ? ? (9)、使用比較運算或between會使聯(lián)合索引從使用比較運算的下一個索引處斷開
)
2.?優(yōu)化架構(gòu)方面(了解)
在數(shù)據(jù)達到一定量級以后,需要對數(shù)據(jù)庫從主從、分庫分表數(shù)據(jù)分片方面進行優(yōu)化:
1.讀寫分離:主節(jié)點寫,從節(jié)點讀
? 2.分庫:根據(jù)業(yè)務(wù)或者其他維度把數(shù)據(jù)存放到不同數(shù)據(jù)庫
?3.分表:1、水平分表:字段都一樣,分多張表存放不同時間范圍或不同維度的數(shù)據(jù),如實時數(shù)據(jù)表、歷史數(shù)據(jù)表。?2.垂直分表:將不同字段放在多張表,使用外鍵關(guān)聯(lián)。
NO.6 mysql事務(wù)(理解透徹)
1.事務(wù)有哪些特性?
原子性:事務(wù)中所有操作要么全部提交成功,要么全部失敗回滾,不能出現(xiàn)一部分失敗,一部分成功的現(xiàn)象;
一致性:指在事務(wù)的執(zhí)行前后保持數(shù)據(jù)庫的一致性;
隔離性:一個事務(wù)所做的修改在最終提交之前,對其他事務(wù)是不可見的;
永久性:一旦事務(wù)提交,它所做的修改將會永久保存到數(shù)據(jù)庫中,及時系統(tǒng)發(fā)生崩潰,事務(wù)執(zhí)行結(jié)果也不會丟失;
2. 哪幾種事務(wù)隔離級別,會出現(xiàn)的問題?
| 事務(wù)隔離級別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
| 讀未提交(read-uncommitted) | 是 | 是 | 是 |
| 不可重復(fù)讀(read-committed) | 否 | 是 | 是 |
| 可重復(fù)讀(repeatable-read) | 否 | 否 | 是 |
| 串行化(serializable) | 否 | 否 | 否 |
3. 什么是臟讀、不可重復(fù)讀、幻讀 ?
-
臟讀:一個事物讀到了另一個事務(wù)尚未提交的數(shù)據(jù),不符合事務(wù)的隔離性。
-
不可重復(fù)讀:同一個事務(wù)中針對同一行記錄兩次讀出來的結(jié)果不一樣,原因就是第二次讀到了其他事務(wù)修改提交的數(shù)據(jù)。
?幻讀:同一個事務(wù)中針對同一范圍內(nèi)的數(shù)據(jù)兩次讀出來的結(jié)果不一樣,原因就是第二次讀到了其他事務(wù)新增提交 的數(shù)據(jù)。
4.char和vachar區(qū)別 ?
char列長度固定,為創(chuàng)建表時聲明的長度,長度值范圍是1到255,當(dāng)char值未填滿指定長度時,其他空間會用空格進行填充,檢索CHAR值時需刪除尾隨空格?
vachar長度為可變的,實際使用多少空間就占多少空間
6. Redis相關(guān)
NO. 1 支持哪幾種數(shù)據(jù)類型 ?
?1. 支持五種數(shù)據(jù)類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
?NO.2 為什么讀寫速度很快 ?(也可以作為優(yōu)點方面來答)
?1. redis完全基于內(nèi)存
2. 數(shù)據(jù)結(jié)構(gòu)簡單
3. 采用單線程,避免了加鎖、釋放鎖、死鎖、線程間切換等消耗
4. 使用多路I/O復(fù)用模型,非阻塞IO
NO.3 在你們項目有哪些應(yīng)用場景 ?
計數(shù)器**:對 string 進行自增自減運算,從而實現(xiàn)計數(shù)器功能。redis 內(nèi)存型數(shù)據(jù)庫的讀寫性能非常高,很適合存儲頻繁讀寫的計數(shù)量。如每日登錄次數(shù)計數(shù)。
熱點數(shù)據(jù)緩存:將熱點數(shù)據(jù)放到內(nèi)存中。如首頁排行榜數(shù)據(jù),具有很大訪問頻次,使用zset可以實現(xiàn)基于score分數(shù)排序;。
會話緩存:用redis統(tǒng)一存儲多臺應(yīng)用服務(wù)器的會話信息。當(dāng)應(yīng)用服務(wù)器不再存儲用戶的會話信息,也就不再具有狀態(tài),一個用戶可以請求任意一個應(yīng)用服務(wù)器,從而更容易實現(xiàn)高可用性以及可伸縮性。
取數(shù)據(jù)交集、并集:基于redis set 的特性可以對共同好友進行很方便的查詢。
分布式事務(wù)鎖的使用:基于set lock requestId nx ex time 模式可以很方便編寫分布式事務(wù)鎖
NO.4 Redis是基于什么協(xié)議的?
1. Redis 的通信協(xié)議是 Redis Serialization Protocol,翻譯為 Redis 序列化協(xié)議,簡稱 RESP?
-
在 TCP 層
-
是二進制安全的
-
基于請求 - 響應(yīng)模式
-
簡單、易懂
NO.5 Redis持久化機制是怎樣的?(有兩種的,這里的話我就簡單說第一種吧)
第一種:RDB,即 Redis 的內(nèi)存快照,默認持久化機制,它是在某一個時間點將 Redis 的內(nèi)存數(shù)據(jù)全量寫入一個臨時文件,當(dāng)寫入完成后,用該臨時文件替換上一次持久化生成的文件,這樣就完成了一次持久化過程,默認的文件名為dump.rdb。
NO.6? Redis的緩存穿透,緩存擊穿,緩存雪崩,以及對應(yīng)的解決方案 ?(這里初中級應(yīng)該問不到,大家了解即可):
1.緩存穿透:是指緩存和數(shù)據(jù)庫中都沒有的數(shù)據(jù),而用戶不斷發(fā)起請求,如發(fā)起為id為“-1”的數(shù)據(jù)或id為特別大不存在的數(shù)據(jù)。這時的用戶很可能是攻擊者,攻擊會導(dǎo)致數(shù)據(jù)庫壓力過大。
緩存穿透解決方案:(1.接口層增加校驗,如用戶鑒權(quán)校驗,id做基礎(chǔ)校驗,id<=0的直接攔截;
2.?從緩存取不到的數(shù)據(jù),在數(shù)據(jù)庫中也沒有取到,這時也可以將key-value對寫為key-null,緩存有效時間可以設(shè)置短點,如30秒(設(shè)置太長會導(dǎo)致正常情況也沒法使用)。這樣可以防止攻擊用戶反復(fù)用同一個id暴力攻擊啦;
3.?引入布隆過濾器,過濾一些異常的請求!)
2. 緩存擊穿:這個是指緩存中沒有但數(shù)據(jù)庫中有的數(shù)據(jù)(一般是緩存時間到期),這時由于并發(fā)用戶特別多,同時讀緩存沒讀到數(shù)據(jù),又同時去數(shù)據(jù)庫去取數(shù)據(jù),引起數(shù)據(jù)庫壓力瞬間增大,造成過大壓力。
緩存擊穿解決方案:(
1、設(shè)置熱點數(shù)據(jù)不過期;
?2、第一時間去數(shù)據(jù)庫獲取數(shù)據(jù)填充到redis中,但是這個過程需要加鎖,防止所有線程都去讀取數(shù)據(jù)庫,一旦有一個線程去數(shù)據(jù)庫獲取數(shù)據(jù)了,其他線程取鎖失敗后可設(shè)置一個合理睡眠時間之后再去嘗試去redis中獲取數(shù)據(jù);)
3. 緩存雪崩:緩存雪崩是指緩存中數(shù)據(jù)大批量到過期時間,而查詢數(shù)據(jù)量巨大,引起數(shù)據(jù)庫壓力過大甚至down機。和緩存擊穿不同的是,緩存擊穿指并發(fā)查同一條數(shù)據(jù),緩存雪崩是大批量數(shù)據(jù)都過期了,大量數(shù)據(jù)都從redis中查不到,從而查數(shù)據(jù)庫。
解決方案:(
1、緩存數(shù)據(jù)的過期時間設(shè)置隨機,防止同一時間大量數(shù)據(jù)過期現(xiàn)象發(fā)生。
?2、如果緩存數(shù)據(jù)庫是分布式部署,將熱點數(shù)據(jù)均勻分布在不同搞得緩存數(shù)據(jù)庫中。
?3、允許的話,設(shè)置熱點數(shù)據(jù)永遠不過期。
?4、要保證redis的高可用,可以使用主從+哨兵或redis cluster,避免服務(wù)器不可用;
?5、使用redis的持久化RDB+AOF組合策略,防止緩存丟失并且可以快速恢復(fù)數(shù)據(jù);
)
本文章就寫到這里了,祝大家早日找到高新任職,在工作的同志就祝你們步步高升!完結(jié)撒花!看在一萬字的面子上,姥爺們給個贊行不行~
總結(jié)
以上是生活随笔為你收集整理的JAVA初中级面试题总纲(含答案)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringCloud之Eureka的常
- 下一篇: 摩根斯坦利面试题库_有关摩根士丹利面试经