1、Redis如果缓存空间满了怎么处理?
答:Redis中有对应的淘汰机制,用于处理缓存空间不够的情况,我们只需要进行合理的配置就可以了。
一般我们在将数据缓存到redis中的时候就可以设置缓存的过期时间,以免缓存中的数据一直增长。但是我们还是要考虑特殊情况,就是当缓存已经满了的时候,但是我们设置的过期时间还未到,这时如不对缓存空间进行处理,就会发生内存溢出的情况。redis中专门有用于这种情况的淘汰机制。
1、lru 淘汰被最早访问的数据--以链表的形式,最早访问的数据放在链表头,最新访问的数据放在链表尾部,当内存不够的时候,优先删除链表头部的数据。
2、lfu 淘汰访问评率最低的数据--如何确保访问量不受新老数据的影响?--redis为每一个新数据设置了一个时间戳和计数器,只有当计数器到达一定的值,或者过了一定时间,这个新数据才会和其他老数据进行比较。并且计数器的是是随着时间推移,如果没有访问的话计数器会逐渐衰减。
3、随机淘汰--随机抽取一部分数据删除,一般不用
2、servlet的生命周期?
答:初始化:加载servlet类,并调用init()
使用阶段:调用service()方法,
结束阶段:调用destory()方法,此时servlet将等待jvm的垃圾回收
3、类在jvm中的生命周期?
答:加载:jvm加载字节码文件
连接:分为三个步骤
验证:检验字节码文件加载的类是否符合jvm对类的规范。
准备:为静态变量,静态方法在方法区中划分静态区,并给静态变量赋初始值,整型为0,字符型为null,布尔型为false
解析:将符号引用转化为直接引用,就是将地址值赋值为对应的引用对象
初始化:将类中的变量进行初始化赋值,此时的赋值是将类中定义的量赋值给变量
使用:定义对象,进行使用
卸载:在该类没有任何引用后jvm对其进行垃圾回收
4、如何对搜索进行优化?
答:默认此时的搜索是通过遍历来得到数据结果的
1、可以参考elasticSearch中对数据进行的操作,建立一个类,采用倒排索引的方法将所有数据存放到其中,在进行搜的时候通过这个类来查询。
2、也可以吧数据做成二叉树的形式,查询的时候,重二叉树中找数据也会快一点
5、hashmap和hashtable的区别?
答:1、hashMap是线程不安全的,hashtable是线程安全的
2、hashmap中key,value可以为null,hashtable中不行
3、hashmap和hashtable继承的父类是不同的,且hashtable继承的父类以及是淘汰的
6、线程的生命周期?
答:新生--就绪--运行--(阻塞)--死亡
7、线程的状态有那些,以及是如何达到这个状态的?
答:就绪:调用start()方法时,线程就进入线程池等待cpu的调用
运行:cpu给对应线程分配时间片
阻塞:阻塞也可以说是等待状态
有限期等待状态:sleep(timeout) wait(timeout) join(timeout)
无限期等待:wait() join()
wait()如果不定义时间,会一直处于等待状态,直到有另一个线程通过notify()/notifyAll()方法将其唤醒。
join()如果不设置过期时间,就会一直执行wait(0)的方法,直到该线程死亡。
死亡:线程结束会自动死亡
8、wait()和sleep()方法的区别:
答:wait()是Object的方法。sleep()是Thread类的方法
调用wait()方法时,线程会释放cpu资源,直到被notify方法唤醒,sleep()方法在调用的时候不会释放资源,要等到睡眠时间结束继续执行
9、线程池的特点?
答:我们一般用ThreadPoolExcuter来创建线程池
在线程使用不多的情况下,默认使用的是核心线程,任务量提高了,核心线程不够用了,就会逐渐拓展到最大线程数,如果任务量还在提高,线程已经满载运行了,等待队列也满了。此时就会触发拒绝策略,就是不继续接收任务。当任务量减小的时候,除核心线程外,其余的线程会在等待一段时间,后死亡。
10、如何处理数据库返回的结果集?
答:这里解释的是springboot,mybatisplus的情况
首先要创建一个和访问结果中的类型相同的类和一个对应的dao类,然后使访问数据库的类继承mybatisplus中的ServiceImpl类,并将ServiceImpl的泛型设置为<dao类,类名>。ServiceImpl中有通过id或者通过过滤器得到结果集的方法,得到的结果集就是之前建立的类的集合。
11、spring的核心模块有那些?
答:iop容器模块
aop模块
数据库模块
web引用模块
测试模块
12、Redis缓存穿透,缓存击穿,缓存雪崩分别是什么意思以及解决思路
答:缓存穿透:访问数据库中不存在的数据,正常情况下如果查询数据库没有的数据,返回null是不会吧结果放到缓存中,这就导致每次查询都会去访问一次数据库。
解决办法:1、使用布隆过滤器 2、缓存返回的null数据
缓存击穿:访问数据库中存在的一条数据,并且这个访问的并发量很大,缓存击穿就出现在redis中这个数据的key过期的时候,大量的并发同时访问数据库,造成服务器的崩溃。
解决办法:采用互斥锁,即当value值为空的时候不是我们去访问数据库,而是通过redis自带的setnex (set if not exit)来加载对应的key,value。当返回结果为true时,表示数据库中对应的数据已经缓存到redis上了,大并发的数据此时就访问的就是redis中的数据了
缓存雪崩:不同数据访问,并发量很大,如果redis中key在同一时刻过期,也会造成大量数据直接访问数据库,
解决办法:1、分散缓存过期的时间 2、可以设置热点数据永不过期
提前说明一下,这是我面试的问题都是我在网上找的答案,结合自己的话说了一下理解,不一定是正确的,主要作为我个人的总结。