面试题解析11.6日

138 阅读14分钟

1. (点评)说一下功能模块、架构

3. 怎么用redis解决session共享,拦截器怎么写的
q:为什么需要分布式 即将应用程序部署在多台服务器上,并通过nginx做统一的请求分发。而服务器与服务器之间是隔离的,它们的session是不共享的,这就存在session同步的问题了,如下图: 分布式session的解决方案 更合理的方式就是采用类似于Redis这样的高性能缓存服务器,来实现分布式session。 具体实现的思路如下图,我们在服务端增加两段程序:

image.png 从图示可以看出 两端程序是 创建令牌和验证令牌 developer.aliyun.com/article/134… 拦截器怎么写

image.png

4. 查询缓存怎么写的,redis存了什么。

5.  6. 说一下缓存穿透、击穿、雪崩,以及你项目里具体怎么解决雪崩的 缓存穿透是指缓存和数据库中都不存在的数据被频繁请求,导致每次请求都要到数据库去查询,从而失去了缓存的意义。这通常是由于恶意攻击或程序错误引起的。 穿透就是啥都没有可不就直接穿过去了 然后击穿就是本来有 但是突然失效了 所以对应热点数据

7. 秒杀怎么解决
应该是在问怎么解决超卖的问题 (可能还有缓存击穿的问题)www.cnblogs.com/crazymakerc… 解决的方法就是 悲观锁和乐观锁两种都可以

9. 为什么redis分布式锁可以解决一人一单

文章:# redis分布式锁实现原理-以秒杀活动一人一单问题为例

在上述几个小节的描述中,我们循序渐进的讲述了redis分布式锁的实现原理,包括:
(1)利用set nx满足互斥性
(2)利用set ex保证故障时锁依然能释放,避免死锁,提高安全性
(3)利用唯一的线程标识防止锁的误删
(4)利用lua脚本保证删除锁操作的原子性

redis的分布式锁有两种 setnx还有Redisson 针对误删 可以在java里面使用lua脚本 setnx还是有很多问题 blog.csdn.net/qq_43856972…

这个问题的回答就是 因为它可以保证一个时间段内只有一个线程进行描述 blog.csdn.net/weixin_4654…

8. 说一下怎么用redis消息队列解决异步下单的
Redis也可以用来实现消息队列。Redis提供了几种不同的方式来实现消息队列,包括使用ListZSetPubSub模式和Stream等。这些方式各有优劣,适用于不同的应用场景。

这里只会讲解redis的stream实现 Stream 是 Redis 5.0 引入的一种新数据类型,可以实现一个功能非常完善的消息队列。 blog.csdn.net/Drifter_Gal… cloud.tencent.com/developer/a… blog.csdn.net/qq_17732903…

10. 了解redis持久化机制吗(说了AOF、RDB,她说还有别的,没答上 还有混合式的)
redis持久化还有一个混合持久化,先打个rdb快照,再用aof存储后续写命令,redis7之前是一个文件,后面分成三个文件,一个rdb,一个aof,还有一个main文件存储的是两个文件加载的先后顺序

10. 如果加个功能,用户必须发表评论才能买东西,怎么设计

10. 登录功能只有短信验证码吗,如果需要更多元化的登录方式怎么实现

12. (另一个项目)瓶颈在哪,怎么调优的

13. java线程池的工作原理、执行流程
任务进来 然后如果线程数量小于核心 那么就创建线程去执行 如果不小于就放入阻塞队列 如果满了就创建线程 如果线程也满了就使用拒绝策略 默认是抛弃任务

14. 手撕:二叉树展开为链表,最小k个数
leetcode.cn/problems/fl… 看题解其实就是子树的嫁接 第一步

将 根节点 的左子树插入到右子树的地方

image.png

第二步 将原来的右子树接到左子树的最右边节点 第三步

image.png 所以代码第一步先判断左子树是不是空的 如果为空那么就看右子树 如果有左子树 那么把左子树移出去 让右子树占领左子树的位置

www.nowcoder.com/feed/main/d…

www.nowcoder.com/feed/main/d… 1.反射是什么
反射(Reflection)是 Java 的一种特性,它可以让程序在运行时获取自身的信息,并且动态地操作类或对象的属性、方法和构造器等。通过反射功能,可以让我们在不知道具体类名的情况下,依然能够实例化对象调用方法以及设置属性 blog.csdn.net/qq_45450889…

2.反射的坏处有哪些
blog.csdn.net/qq_36470686… 主要是性能和安全问题

3.sychonized关键字解释
blog.csdn.net/qq_28082757… 第一 有啥用 第二 怎么用以及作用域 第三 底层原理是什么 blog.csdn.net/qq_28082757… segmentfault.com/a/119000004…

4.sychonized锁升级
blog.csdn.net/a1405/artic…

www.cnblogs.com/star95/p/17… 注意第一步是无锁状态

5.wait和sleep区别
developer.aliyun.com/article/932…

6.一小部分项目

7.redis主从靠什么保持一致性 其实就是redis主从同步机制

因为Redis主从库目的呢其实就是为了实现高可靠。上篇文章中我们说过Redis的AOF、RDB日志其实就是为了减少****数据丢失,这是高可靠的一部分。 这篇文章呢,我们聊聊Redis实现高可靠的另一方面:尽量减少服务中断。这里Redis是怎么做的呢?Redis的做法是增加副本冗余,将一份数据同时保存在多个实例上。这样某个实例挂掉并不影响其它实例提供对外服务,保证我们的业务正常运行 cloud.tencent.com/developer/a… 其实就是问redis怎么保证的主从两个的数据一致

8.redisson看门狗机制
Redisson提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期,也就是说,如果一个拿到锁的线程一直没有完成逻辑,那么看门狗会帮助线程不断的延长锁超时时间,锁不会因为超时而被释放。
默认情况下,看门狗的续期时间是30s,也可以通过修改Config.lockWatchdogTimeout来另行指定。另外Redisson 还提供了可以指定leaseTime参数的加锁方法来指定加锁的时间。超过这个时间后锁便自动解开了,不会延长锁的有效期。 www.cnblogs.com/jelly12345/…

image.png

9.redisson可重入原理
Redisson通过维护一个计数器来实现锁的可重入特性。

当同一个线程第一次获取锁时,Redis会记录下这个线程的,并将锁的持有次数设置为1。 如果这个线程再次请求锁(即可重入操作),Redisson会检测到当前持有锁的与当前线程相同,则不会重新设置锁,而是简单地增加计数器,表示这个线程再次持有了锁。 每次释放锁时,Redisson会减少计数器,只有当计数器减为0时,锁才会真正释放。 blog.csdn.net/weixin_5389…

10.redisson官方为什么不推荐红锁(求解答)

blog.csdn.net/feiying101/… way2j.com/a/1338

11.final关键字
blog.csdn.net/qq_42651904…

12.mysql的存储引擎有哪些,异同
blog.csdn.net/riemann_/ar…

13.ThreadLocal是什么,作用
JDK1.2开始提供的java.lang.ThreadLocal的使用方式非常简单 所以threadlocal只是一个类而已 zhuanlan.zhihu.com/p/192997550

14.说说幻读
一次事务 两次不同的select 结果集数量不一样

15.怎么解决幻读
看小林coding的文章

16.什么是回表

,回表(Look Up)指的是在进行索引查询时,首先通过索引定位到对应页,然后再根据行的物理地址找到所需的数据行。换句话说,回表是指根据索引查询到的主键值再去访问主键索引,从而获取完整的数据记录。

blog.csdn.net/qq_21891743…

场景八股:
1.说说redis集群的原理。
www.yuque.com/snailclimb/…

2.说说渐进式哈希,redis底层怎么扩容的?
zhuanlan.zhihu.com/p/258340429…

3.微博上面的热搜,打在了集群的分片上,分片扛不住怎么办?

3.用限流解决,有哪些实现限流的方法?

4.限流的话,用户看到的一个页面就是一个空白页面,对用户不够友好,还有什么别的方案?(冗余key缓存,存储在不同的分片上,把key打散)

5.现在如果我不知道哪个帖子会成为热搜帖子,这种情况怎么处理?(本质原因是无法水平扩容,采用多级缓存解决)

最后手撕,
数组:
1 2 3
4 5 6 
7 8 9
要求打印顺序:1 4 2 3 7 5 8 6 9

www.nowcoder.com/feed/main/d…

www.nowcoder.com/feed/main/d… 垃圾回收算法了解哪些?

新生代和老年代的区别是什么?

当多个线程在新生代申请空间时,jvm 是怎么处理的?(这个不知道)

线程池的参数有哪些?

Spring AOP 和 IOC 是什么? 他们的优点?

Spring Boot 的自动配置原理是什么?

MySQL 索引的数据结构有哪些?B+树相对于其他的结构有什么优点?
blog.csdn.net/Pireley/art…

Redis 的分布式锁的实现?演化过程

https://segmentfault.com/a/1190000041172633

项目拷打。

场景题。

反问。

面完说找老板聊一下。主要是项目拷打。

Java 的反射的作用?为什么他比直接 new 一个对象性能更差?(项目延申的问题)
blog.csdn.net/qq_16828223… 可能是步骤多了吧 涉及到底层了

项目拷打。
理想,规划。
反问。

1. 说说数据结构

3. JDK中,你觉得哪种数据结构用的比较好、比较巧妙的,讲讲
www.runoob.com/java/java-d… 在javautil包下

5. HashMap的链表为什么要转换成红黑树

7. HashMap为什么是线程不安全的?在哪几个地方线程不是安全的
cloud.tencent.com/developer/a… 1.7 1.8分版本的

9. 假如要你做一个,就是全局唯一ID,你会采用哪种算法来实现?(我说用Hash函数,再哈希去解决冲突,他说数据很多的话内存太大。我说用时间戳去拼接字符串,他说不行)

ID在程序设计中,无处不在,至关重要。

11. 网络七层,大体说一下视频通话的时候数据在网络中的流转过程

https://developer.aliyun.com/article/1508695


13. TCP三次握手,以及怎么解决丢包问题的
www.yuque.com/snailclimb/… zhuanlan.zhihu.com/p/356225028 www.cnblogs.com/fly-bryant/…

15. 项目相关

17. 假如我是有一个 Innodb 的 MySQL 表,我要查询它 ID 从 1 到 100 数据,这个数据查询的过程,它大体的在数据库的流程是什么样的?
这个是select流程 www.cnblogs.com/llzhang123/… blog.csdn.net/STILLxjy/ar…

19. 描述一下b+树的结构

21. 索引失效的情况

23. 对Spring的看法

25. Spring Boot 集成了 原来Spring的哪些组件

27. 你觉得自己做技术这一行做到什么程度是比较厉害的?或者你想成为什么样的一个技术人?

28. 反问

www.nowcoder.com/feed/main/d…

项目介绍

多线程你了解多少

加锁是怎么加锁的

互斥锁有哪些

你用过哪几种锁

怎么使用乐观锁的

常见的锁有哪些

分布式锁 redlock

悲观锁有哪些你用过哪些

lock接口

多线程通信有哪些

案例 a b两个线程 a执行到一半需要等待b线程的执行结果 这个逻辑怎么实现 b线程通过什么方式将结果传输给a线程 全局变量可以传输吗 ? 具体是怎么等待的 怎么唤醒 阻塞队列怎么实现等待的

thread.join是什么意思 管道流是什么用法

什么情况下去做封装

内部类的特征 什么是静态内部类

设计模式直到哪些

单例模式 实现 使用案例 饿汉懒汉

盒马秋招Java二面

自我介绍

用过什么数据库

redis用来做什么的

过期时间设置多久,超过过期时间会咋样

除了做缓存还能干嘛

其他非关系型数据库了解哪些

MySQL底层数据结构

MySQL写SQL需要注意哪些,不走索引有哪些情况

索引优化有没有做过

分析是否走索引有哪些办法

红黑书数据结构

有没有了解微服务结构

做微服务的好处是什么,难点是什么

有没有了解过ddd,你的理解

接口qps暴增怎么处理,还有没有再想一下

哪些方法可以实现限流

降级怎么降

还有没有什么方法

未来3-5年在技术需要达到什么效果,目前最缺的是什么

毕业之后第一份工作最看重的是什么

期望薪资

武汉城市有什么看法,有没有打算长期发展

反问

多久有结果

看重应届生哪些能力

1. 自我介绍

3.讲下你的学习,说着打开了我的博客 blog.picmemo.top

4.讲了我博客的学习流程

5.讲实习

6.redis的部署

7.redis的主从架构的部署

8.redis主从数据的同步

www.yuque.com/snailclimb/…

9.redis的持久化

10.Redis的zset
blog.csdn.net/shulianghan…

11.b+树

12.为什么不用B+树,用跳表

13.出了mysql的锁相关的sql题

A:select name from A where id = a  -> A

B: update A set name = B

A:select name from A where id = a ->?

13.delete from table where a =1,里面有几个锁

14.根据我上面说的,你觉得隔离级别和锁有关系吗

有啊 隔离级别的不同 会导致

15.反问

www.nowcoder.com/discuss/682…

1. 自我介绍

3.hashmap的底层

2.mysql的索引底层
是b+树作为底层数据结构

3.Zset的底层
cloud.tencent.com/developer/a…

4.红黑树的基础知识了解多少
blog.csdn.net/cy973071263…

5.为什么Zset用跳表不用红黑树,B+树
blog.csdn.net/f80407515/a…

6.聊实习

7.你还知道哪些http实体头
www.cnblogs.com/timssd/p/58… 还分好几种 比如响应头 请求头 通用头

8.http状态码知道哪些

blog.csdn.net/beyond150/a…

9.聊天

10.俺CSDN喜提快手✌的关注

然后就是算法题

1. 自我介绍

3. 除了本科阶段课堂学习java之外,别的途径怎么学习java的

4. 项目是自学的,还是参与公司开发的

6. jdk、jre、JVM的区别
www.cnblogs.com/bingyimeili…

8. volatile 了解吗? 作用是什么?

10. ++操作符是线程安全的吗?
不是 ++ 分为三步 第一就是从主内存取值 然后+1后 再写入到主内存

12. 如何创建一个线程

14. runnable和callable有什么区别

两者的区别

1、最大的区别,runnable没有返回值,而实现callable接口的任务线程能返回执行结果
2、callable接口实现类中的run方法允许异常向上抛出,可以在内部处理,try catch,但是runnable接口实现类中run方法的异常必须在内部处理,不能抛出 blog.csdn.net/syw_0406/ar…

16. 线程池的核心参数

18. 有了线程之后,为什么还要线程池?

20. 简历中提到线程池,是怎么用的, 它的作用是什么,他的目的是什么?是提高查询速度还是怎么样?

22. 如何来确保线程安全?

blog.csdn.net/weixin_4331…

24. 用到哪些消息中间件(Rabbitmq),有哪些消息模型?

26. 生产者广播消息,怎么设计

28. 消费者是怎么获取消息的, 是直接连交换机吗 这个问的估计是ribbitmq

31. 生成者发生消息到两个消息队列,消费1能收到几条

33. 另一种场景,一个消费者消费一条消息,怎么设计

34. spring、Springboot、springmvc、Mybatis、SpringCloud有哪些常用的注解(当时想不起了,就随便说了几个)

36. SpringbootApplication注解的作用

38. 看你使用了微服务,SpringCloud alibaba有哪些你用到的组件?

40. Gateway你了解他的工作流程吗?
blog.csdn.net/Jokeronee/a…

42. 这个路由转发包含哪些要素呢?

image.png

44. redis有哪些基本类型,以及hash怎么实现put操作(redis命令)

46. redis的持久化机制?

48. MySQL索引失效的原则?

作者:靠谱的三文鱼希望被捞
链接:www.nowcoder.com/feed/main/d…
来源:牛客网

算法题 还有冒泡排序的写法要记得做

image.png 学这些 www.programmercarl.com/

image.png 对于遍历的理解 可以看整体 比如前序遍历 顺序是中左右 那么第一个肯定是5 然后就是左子树的遍历 左子树又是开始中左右 那么就是4 1 2 右边也一样

sql题目 blog.csdn.net/qiqi123i/ar… 做前面十个题目 知识点1: inner join www.w3schools.com/SQL/sql_joi…

public class Main {
private  static  void  change(StringBuffer a, StringBuffer b) {
    a=b;
    b = new StringBuffer("new world");
    a.append("new world");
}
public  static void main(String[] args) {
    StringBuffer str1 = new StringBuffer("hello");
    StringBuffer str2 = new StringBuffer("great ");
    change(str1, str2);
    System.out.println(str1.toString());
    System.out.println(str2.toString());
}

}