当前位置:网站首页>面试题总结(2) IO模型,集合,NIO 原理,缓存穿透,击穿雪崩
面试题总结(2) IO模型,集合,NIO 原理,缓存穿透,击穿雪崩
2022-07-03 09:51: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实例,个别节点宕机,依然可以保持服务的整体可用。
边栏推荐
- After 8 years of industry thinking, the test director has a deeper understanding of test thinking
- 使用onvif协议操作设备
- Qt:qss custom qheaderview instance
- Qt:qss custom qspinbox instance
- 测试理论概述
- 触摸与屏幕自动旋转调试
- How to realize automatic testing in embedded software testing?
- Qt:qss custom qscrollbar instance
- php如何解决高并发问题
- 10. Nacos source code construction
猜你喜欢
The five-year itch of software testing engineers tells the experience of breaking through bottlenecks for two years
我对测试工作的一些认识(资深测试人员总结)
可以写进简历的软件测试电商项目,不进来get一下?
Error installing the specified version of pilot
[proteus simulation] 16 channel water lamp composed of 74hc154 four wire to 12 wire decoder
snownlp情感分析
Clion debug
MAUI Developer Day in GCR
I, a tester from a large factory, went to a state-owned enterprise with a 50% pay cut. I regret it
测试理论概述
随机推荐
Crawl with requests
Clion debug
Qt:qss custom qmenubar instance
CorelDRAW Graphics Suite 2022新版功能详情介绍
值得关注的15种软件测试趋势
你真的需要自动化测试吗?
ORACLE 11G 单机冷备数据库
Software testing redis database
反正切熵(Arctangent entropy):2022.7月最新SCI论文
My understanding of testing (summarized by senior testers)
游戏测试相关 测试一个英雄的技能(春招被问比较多的一道题)
After 8 years of industry thinking, the test director has a deeper understanding of test thinking
8年测试总监的行业思考,看完后测试思维认知更深刻
Do you really need automated testing?
Test what the leader should do
软件测试(测试用例)编写之俗手、本手、妙手
在职美团测试工程师的这八年,我是如何成长的,愿技术人看完都有收获
The element form shows the relationship between elementary transformation and elementary matrix
IIS does not take effect after modifying the configuration information
QT: QSS custom qtableview instance