当前位置:网站首页>面試題總結(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實例,個別節點宕機,依然可以保持服務的整體可用。
边栏推荐
- 值得关注的15种软件测试趋势
- 最高月薪18K 拥有好的“心态和选择”, 成功就差“认真和坚持”~
- Ext file system mechanism principle
- Solve the problem that pycharm Chinese input method does not follow
- [proteus simulation] 16 channel water lamp composed of 74hc154 four wire to 12 wire decoder
- Qt:qss custom qlineedit instance
- 如何清理v$rman_backup_job_details视图 报错ORA-02030
- Qt:qss custom qlistview instance
- In the middle of the year, I have prepared a small number of automated interview questions. Welcome to the self-test
- 反正切熵(Arctangent entropy):2022.7月最新SCI论文
猜你喜欢

Communication software development and Application

I have been doing software testing for three years, and my salary is less than 20K. Today, I put forward my resignation

UI自动化测试如何走出困境?价值又如何体现?

Differences among norm, normalize and normalized in eigen

可以写进简历的软件测试电商项目,不进来get一下?

QT: QSS custom qtabwidget and qtabbar instances

Snownlp emotion analysis

Error installing the specified version of pilot

英特尔13代酷睿旗舰曝光,单核5.5GHz

【Proteus仿真】74HC154 四线转12线译码器组成的16路流水灯
随机推荐
Solution: jupyter notebook does not pop up the default browser
php如何解决高并发问题
图解网络:什么是虚拟路由器冗余协议 VRRP?
软件测试工程师的5年之痒,讲述两年突破瓶颈经验
Commonly used discrete random distribution
What experience is there only one test in the company? Listen to what they say
Basic usage of sqlmap
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
Qt:qss custom qmenubar instance
历经一个月,终于拿到金蝶Offer!分享一下四面面经+复习资料
Google Earth Engine(GEE)——GHSL 全球人口网格数据集250米分辨率
After 8 years of industry thinking, the test director has a deeper understanding of test thinking
BI技巧丨权限轴
IIS does not take effect after modifying the configuration information
Logstash backup tracks the data records reported
ORACLE 11G 单机冷备数据库
如何让让别人畏惧你
在职美团测试工程师的这八年,我是如何成长的,愿技术人看完都有收获
Qt:qss custom qscrollbar instance
搭建ADG后,实例2无法启动 ORA-29760: instance_number parameter not specified