当前位置:网站首页>面試題總結(2) IO模型,集合,NIO 原理,緩存穿透,擊穿雪崩
面試題總結(2) IO模型,集合,NIO 原理,緩存穿透,擊穿雪崩
2022-07-03 11:12:00 【是小晴晴呀】
1.幾種 IO 模型,
阻塞IO、非阻塞IO、多路複用IO、信號驅動IO, 异步IO (在我前面文章有詳細講解IO的幾種模型 阻塞,非阻塞,io多路複用,信號驅動和异步io_是小晴晴呀的博客-CSDN博客
2.Java集合類
Java中的集合類分為4大類,分別由4個接口來代錶,
它們是Set、List、Queue、Map。其中,Set、List、Queue、都繼承自Collection接口。
Set代錶無序的、元素不可重複的集合。
List代錶有序的、元素可以重複的集合。
Queue代錶先進先出(FIFO)的隊列。
Map代錶具有映射關系(key-value)的集合。
Java提供了眾多集合的實現類,它們都是這些接口的直接或間接的實現類,其中比較常用的有:HashSet、TreeSet、ArrayList、LinkedList、ArrayDeque、HashMap、TreeMap等。
上面所說的集合類的接口或實現,都比特於java.util包下,這些實現大多數都是非線程安全的。雖然非線程安全,但是這些類的性能較好。如果需要使用線程安全的集合類,則可以利用Collections工具類,該工具類提供的synchronizedXxx()方法,可以將這些集合類包裝成線程安全的集合類。
java.util包下的集合類中,也有少數的線程安全的集合類,例如Vector、Hashtable,它們都是非常古老的API。雖然它們是線程安全的,但是性能很差,已經不推薦使用了。
3.NIO 的實現原理
(Buffer、Channel、Selector)
NIO是基於IO多路複用模型的實現,它包含三個核心組件,分別是Buffer、Channel、Selector。
1. NIO是面向緩沖區的,在NIO中所有的數據都是通過緩沖區處理的。Buffer就是緩沖區對象,無論讀取還是寫入,數據都是先進入Buffer的。Buffer的本質是一個數組,通常它是一個字節數組,也可以是其他類型的數組。Buffer是一個接口,它的實現類有ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer。
2. Channel是一個通道,可以通過它讀取和寫入數據。與流不同的是,流是單向的,而Channel是雙向的。數據可以通過Channel讀到Buffer裏,也可以通過Channel寫入到Buffer裏。為了支持不同的設備,Channel接口有好幾種子類,如FileChannel用於訪問磁盤文件、SocketChannel和ServerSocketChannel用於TCP協議的網絡通信、DatagramChannel用於UDP協議的網絡通信。
3. Selector是多路複用器,可以通過它監聽網絡IO的狀態。它可以不斷輪詢注册的Channel,如果某Channel上有連接、讀取、寫入事件發生,則這個Channel就處於就緒狀態,就會被Selector輪詢出來。所有被輪詢出來的Channel集合,我們可以通過SelectionKey獲取到,然後進行後續的IO操作。
4.緩存穿透、緩存擊穿、緩存雪崩有什麼區別,該如何解决?
緩存穿透:客戶端查詢根本不存在的數據,使得請求直達存儲層,導致其負載過大,甚至宕機。出現這種情况的原因,可能是業務層誤將緩存和庫中的數據删除了,也可能是有人惡意攻擊,專門訪問庫中不存在的數據。
解决方案:
1. 緩存空對象:存儲層未命中後,仍將空值存入緩存層,客戶端再次訪問數據時,緩存層直接返回空值。
2. 布隆過濾器:將數據存入布隆過濾器,訪問緩存之前以過濾器攔截,如果數據不存在則直接返回空值。
緩存擊穿:一份熱點數據,它的訪問量非常大。在其緩存失效的瞬間,大量請求直達存儲層,導致服務崩潰。
· 解决方案:
1. 永不過期:熱點數據不設置過期時間,所以不會出現上述問題,這是“物理”上的永不過期。或者為每個數據設置邏輯過期時間,當發現該數據邏輯過期時,使用單獨的線程重建緩存。
2. 加互斥鎖:對數據的訪問加互斥鎖,當一個線程訪問該數據時,其他線程只能等待。這個線程訪問過後,緩存中的數據將被重建,届時其他線程就可以直接從緩存中取值。
緩存雪崩:在某一時刻,緩存層無法繼續提供服務,導致所有的請求直達存儲層,造成數據庫宕機。可能是緩存中有大量數據同時過期,可能是Redis節點發生故障,導致大量請求無法處理。
· 解决方案:
1. 避免數據同時過期:設置過期時間時,附加一個隨機數,避免大量的key同時過期。
2. 啟用降級和熔斷措施:在發生雪崩時,若應用訪問的不是核心數據,則直接返回預定義信息/空值/錯誤信息。或者在發生雪崩時,對於訪問緩存接口的請求,客戶端並不會把請求發給Redis,而是直接返回。
3. 構建高可用的Redis服務:采用哨兵或集群模式,部署多個Redis實例,個別節點宕機,依然可以保持服務的整體可用。
边栏推荐
猜你喜欢
独家分析 | 关于简历和面试的真 相
UI自动化测试如何走出困境?价值又如何体现?
8年测试总监的行业思考,看完后测试思维认知更深刻
Do you really need automated testing?
Differences among norm, normalize and normalized in eigen
如何清理v$rman_backup_job_details视图 报错ORA-02030
英特尔13代酷睿旗舰曝光,单核5.5GHz
Unity移动端游戏性能优化简谱之 画面表现与GPU压力的权衡
ByteDance layoffs, test engineers were almost destroyed: how terrible is the routine behind the recruitment of large factories?
Activity and fragment lifecycle
随机推荐
Qt:qss custom qstatusbar instance
公司测试部门来了个00后卷王之王,老油条感叹真干不过,但是...
表空间创建管理及控制文件管理
Is pinduogai's sales safe in 2022?
Do you really need automated testing?
如何清理v$rman_backup_job_details视图 报错ORA-02030
Solution: jupyter notebook does not pop up the default browser
QT: QSS custom qsplitter instance
QT: QSS custom qtoolbutton instance
Activity and fragment lifecycle
Basic theoretical knowledge of software testing -- app testing
ByteDance layoffs, test engineers were almost destroyed: how terrible is the routine behind the recruitment of large factories?
How did I grow up in the past eight years as a test engineer of meituan? I hope technicians can gain something after reading it
Internet Socket (非)阻塞write/read n个字节
Differences among norm, normalize and normalized in eigen
可以写进简历的软件测试电商项目,不进来get一下?
First line of code kotlin notes
ORACLE 11G 单机冷备数据库
Hal -- writing hardware drivers
Google Earth Engine(GEE)——GHSL 全球人口网格数据集250米分辨率