个人开发的基于内存的请求监控系统。欢迎star和一同参与。https://github.com/standup-jb/tortoise
Java 常见面试题
Spring
- Spring AOP与IOC的实现原理
- Spring的beanFactory和factoryBean的区别
- 为什么CGlib方式可以对接口实现代理?
- RMI与代理模式
- Spring的事务隔离级别,实现原理
- 对Spring的理解,非单例注入的原理?它的生命周期?循环注入的原理,7、aop的实现原理,说说aop中的几个术语,它们是怎么相互工作的?
- Mybatis的底层实现原理
- MVC框架原理,他们都是怎么做url路由的
- spring boot特性,优势,适用场景等
- quartz和timer对比
- spring的controller是单例还是多例,怎么保证并发的安全
数据库
-
mysql的语句优化,使用什么工具;
-
mysql的索引分类:B+,hash;什么情况用什么索引;
-
mysql的存储引擎有哪些,区别是什么。
-
说说事务的特性和隔离级别;
-
悲观锁和乐观锁的区别,怎么实现;
悲观锁是独占的。在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制。
乐观锁是共享锁。乐观锁在使用CAS策略来保证安全性。每个事物在修改后都会将版本增加。读取出数据时,将版本号一同读出,之后更新。将提交数据的版本数据与数据库表对应记录的当前版本信息进行对比。如果提交的版本号大于数据库当前版本号就予以更新。 -
MySQL InnoDB存储的文件结构
在Mysql中建立任何一张数据结构表,在数据结构目录下都有对应的.frm文件。.frm文件是用来保存每个数据表的元数据(meta)信息。包括表结构的定义。.frm文件跟数据库存储引擎无关。
https://blog.csdn.net/chenjiayi_yun/article/details/45533909 -
索引树是如何维护的?
-
数据库自增主键可能的问题
-
MySQL的几种优化
-
mysql索引为什么使用B+树
-
数据库锁表的相关处理
-
索引失效场景
-
高并发下如何做到安全的修改同一行数据,乐观锁和悲观锁是什么,INNODB的行级锁有哪2种,解释其含义
-
数据库会死锁吗,举一个死锁的例子,mysql怎么解决死锁
多线程
-
ThreadLocal用过么,原理是什么,用的时候要注意什么
ThreadLocal用来存放线程私有的变量。ThreadLocalMap是存储结构,ThreadLocal的key是类的实例变量。Value是是用户的值。用的时候注意要尽量手动调用Remove函数,手动删除不再使用的ThreadLocal类,以免造成内存泄露。初始容量16,负载因子2/3.解决冲突的方法是再Hash法。 -
Synchronized和Lock的区别
Synchronized是JVM层面上的锁。lock比Synchronized有更好的性能。synchronize会自动释放锁。lock不会,必须在finally里面释放。lock还有更强大的功能。例如,TryLock方法以非阻塞的方式去拿锁。
Synchronized可以锁住块,对象,类。 -
synchronized 的原理,什么是自旋锁,偏向锁,轻量级锁,什么叫可重入锁,什么叫公平锁和非公平锁
Synchronized的原理是有一个监视器锁。只有拿到了监视器锁才可以使用同步的代码和功能。
偏向锁和轻量锁(比较难理解) -
concurrenthashmap具体实现及其原理,jdk8下的改版
-
用过哪些原子类,他们的参数以及原理是什么
AtomicInteger AtomicLong -
cas是什么,他会产生什么问题(ABA问题的解决,如加入修改次数、版本号)
-
如果让你实现一个并发安全的链表,你会怎么做
-
简述ConcurrentLinkedQueue和LinkedBlockingQueue的用处和不同之处
-
简述AQS的实现原理
-
countdowlatch和cyclicbarrier的用法,以及相互之间的差别?
-
concurrent包中使用过哪些类?分别说说使用在什么场景?为什么要使用?
-
LockSupport工具
-
Condition接口及其实现原理
-
Fork/Join框架的理解
-
jdk8的parallelStream的理解
-
分段锁的原理,锁粒度减小的思考
Redis
-
Redis和Memcache区别
Redis不仅有K-V 数据结构。还有SortedList HashSet HyperLogLog 。
Redis是可以持久化的。Memcache不能够持久化。 -
Redis如何持久化 RDB和AOF
RDB快照是每隔一定时间就将内存里面的值保存下来。每次都将内存里面的全部进行保存。这样会导致大量的IO。所以可能会导致性能不是很好。
AOF。Append-only file redis在每次收到写命令的时候都会通过write将操作写入到文件中。当Redis重启的时候就会通过重新执行文件中保存的写命令来内存中重建数据库的内容。 -
Redis集群同步
1、Redis集群的复制功能是支持多个数据库之间的数据同步。一类是主数据库。一类是从数据库。主数据库可以进行读写操作,当发生写操作的时候会自动将数据同步到从数据库。而从数据库一般只读。并接受主数据库同步过来的数据。一个主数据库可以有多个从数据库,而一个从数据库只能游一个主数据库。
参考: https://blog.csdn.net/u011204847/article/details/51307044 -
Redis数据添加过程是怎样的:哈希槽
-
Redis的淘汰策略有那些 volatile(不稳定)
1.noeviction. 当内存使用到达阈值的时候,所有引起申请内存的命令会报错。
2.allkeys-lru: 在主键空间中。优先移出最近未使用的key。
3.volatile-lur:在设置了过期时间的键空间里面。优先移除最近未使用的key。
4.allkeys-random:在主键空间里面。随机移出某个key。
5.valatile-random:在设置了过期时间的键空间里面,随机移除某个key。
6.volatile-ttl:在设置了过期时间的键空间里面,具有更早过期时间的key优先移除。 -
Redis有那些数据结构
Redis 有 K-V .String .Hash .List Set. SortedSet HyperLogLog等数据结构。 -
Redis为什么是单线程的
因为CPU不是Redis的瓶颈。Redis的瓶颈最有可能是机器的内存和网络带宽。 -
Redis使用场景
在需要使用到缓存的地方。而且缓存需要持久化保存。互联网企业使用Redis比较多。目前在微博内使用Redis是最多的。包括使用Redis对用户关注。评论,点赞进行缓存。 -
Sentinel
Redis-Sentinel是Redis官方推荐的高可用解决方案,当Redis做Master-slave的高可用方案的时候,假如Master已经宕机了。Redis本身都没有实现自动进行主备切换。而Redis-Sentinel本身是一个独立的进程。它能监控多个master-slave集群。发现master宕机后能自动切换。 -
集群分片原理
-
Redis并发竞争问题如何解决。
1、使用独占锁的方式,类似操作系统Mutex机制。
2、使用乐观锁。 -
Redis事务的CAS操作
Watch指令在Redis事务中提供了CAS的行为。为了检测被Watch的keys在是否有多个clients同时改变引起冲突,这些keys将会被监控。如果至少有一个keys在执行exec命令前被修改。整个事务将会回滚,不执行任何动作,从而保证原子性。并且执行exec会得到null的回复。 -
Redis缓存失效策略
1、定时删除 在设置key的过期时间的时候,为key创建一个定时器。由定时器来进行删除。
2、惰性删除 key过期的时候不删除,在每次从数据库获取key的时候去检查是否过期。容易造成内存泄露。
3、定期删除 每隔一定的时间执行一次删除Key操作。
Redis采用的是惰性删除+定期删除两种方式结合。 -
Mysql 2000W。Redis20W如何保证Redis中数据都是热点数据。
在Redis的数据,如果命中一次就增加过期时间,这种命中次数越多的在Redis里面的过期时间就会越长。如果命中次数少的就会很快就过期。这样就能保证在Redis里面存放的数据是最热的数据。 -
缓存穿透解决方法
就是这个值是一个一定不存在的值,那么缓存里面肯定是没有的,所以就肯定需要去查询数据库里面的内容。但是查询数据库就会导致压力变大。就失去了缓存的意义。简单的方法就是布隆过滤器。如果明显觉得这个值不存在,就直接拦截掉。不让访问数据库。 -
缓存雪崩
缓存雪崩是我们设置缓存时采用了相同的过期时间,导致缓存在某一个时刻同时失效。请求全部到达DB。DB压力过重导致雪崩
加锁或者队列的方式来保证缓存的单线程读写。从而避免大量的并发请求落到底层存储系统上。一个简单的方法是避免大家的失效时间是一致的。 -
缓存击穿
缓存击穿,对于一些设置了过期时间的key值。如果key在某些时间被超高并发的访问。是一种热点上数据。如果这个时候这个key过期了。那么大量的并发访问都会将压力加载到数据库。解决方法
1、保证在大量访问的时候不要让key过期。
2、在缓存失效的时候不要立刻去访问DB。而是先用缓存工具去互斥加锁。一个一个的去访问后端DB -
用Redis实现一段恶意登陆保护的代码。限制一小时内每用户ID只能登录5次。
设置用户的ID为key。这个key的过期时间是1个小时。每次如果登陆就将key的值加一。
如过获取到key的值大于5则返回不让进行登录。
参考链接
Java面试总结之真题
Java面试总结之总结题
Java面试之面经
如果对你有用,点个关注呗。会持续更新
互联网内推
上海知名互联网内推,有意者私聊,或者简历砸我邮箱jiangbiao3460240@163.com
测试,开发,运维啥都缺。只要能写代码都可以。内推可以关注进度,进一步掌握更多内幕消息。