新国都面试真题

文章目录

1.项目的高并发在哪里有所体现?

项目里面的抢券逻辑涉及到高并发,优惠力度大,单词访问量激增,这里用到了lua脚本判断库存,用户是否下单,是否一人一单,CAS控制库存,redission分布式锁保证一人一单。

2.为什么采用redis实现登录功能

可能后续项目扩增,如果是单纯session登录,在集群环境下就会存在问题,因为你session只是存储在一台机器的jvm内存中,其他机器无法感知,基于redis,所有机器可以从redis里获取

3.jwt登录这块在项目中如何做的呢?如果两个人登录同一个账户,后面登录的把之前登录的挤下线,你会怎么做?

1.jwt首先是前端发送登录请求,后端判断,通过后就生成一个jwt令牌返回给前端,jwt(header,payload,signature),前端保存到localstorage/sessionsotorage中,每次请求接口都携带这个jwt,后端拦截器校验,通过则放行。

  1. 用户登录吧userid:token:{token}存储到redis中,如果另一台设备登录就替换这里的token,原来的用户登录判断redis就不会通过,就会强制返回到登录界面

4.如果一个项目是新版本,但是你又不太确定他是不是稳定版本,所以你要做一个灰度发布的功能,你怎么做这个功能

用户请求时,网关层根据id进行hash运算,符合要求的走新版本,不符合的走老版本

5.bean的生命周期,springboot的自动装配流程?

首先是容器启动时解析xml或者注解,为每个bean生成Beandefination对象(记录类型,作用域等信息);当需要bean得时候通过反射实例化对象,然后进行依赖注入,然后Bean实现了aware接口,获取bean名称,获取容器得功能。接着执行BeanPostProcessor比如aop前置增强就在这里实现,然后调用bean初始化方法,Beanpostprocess(after)aop得后置增强就在这,最后bean就可以使用了

自动装配流程:SpringBootApplication启动类下面包含EnableAutoConfiguration,下面包含@Import注解回去读取依赖jar包下的自动配置类清单spring.factories,如果springboot引入了某些依赖,就会自动读取配置好这些配置类

6.mysql有哪些引擎,innodb的索引是如何实现的?为什么要选用b+树?

常见的有innodb和Myisam,其中innodb是默认的存储引擎,支持事务行级锁和外键,基于b+树实现,主键索引叶子节点存放整行数据,二级索引存放主键值。选择b+树的原因是对比二叉树这些,层级低,磁盘的IO少,并且叶子节点通过链表链接有助于范围查询。

7.讲一下mysql的四种隔离级别,可重复读是怎么实现的,mvcc是怎么实现的?

读未提交,读已提交(避免脏读),可重复读(避免重复读),串行化(避免幻读)

脏读:一个事务读取到另一个事务还未提交的数据

不可重复读:一个事务先后两次读取的数据不一致,第一次读数据为A,再读B提交了数据,变成b

幻读:执行次相同的查询,得到的数据行不一样

可重复读级别下,两次读取数据得到的结果一样

mvcc的实现是通过表的隐藏字段和读视图实现的。

隐藏字段包括事务id和undolog指针,undolog日志记录了不同事务修改的多个数据版本,读视图(最小事务id,预分配事务id,活跃事务id,当前事务id决定规则)决定快照读读取哪一个版本的数据,包含RC级别下读取最新已提交的数据,RR级别读取的是第一次读到的数据。

8.redis中出现大key的情况需要如何处理呢?

一开始的设计上就要避免大key的问题,可以拆分存储

定期redis扫描大key,及时优化

9.redis中redission分布式锁怎么实现的,redis什么特性可以保证它在多线程下是一个安全的

redission分布式锁的核心是利用redis的原子操作实现的,加锁使用的是底层的 set key value nx px实现。解锁用的lua脚本判断锁的value是否是自己的。如果是才删除

同时redission底层采用了看门狗机制,可以自动进行锁续期,避免业务执行时间长导致锁释放的过早

2.redis多线程下是安全的在于核心的数据操作都是单线程执行的,同时IO多路复用机制保证了包并发的处理能力,IO多路复用机制用内核的一个线程监听所有的socket连接,可读可写才得到通知

10.浏览器输入一个网址去进行访问,具体过程,用了哪些协议

DNS 域名解析----TCP三次握手---TLS加密握手---HTTP请求---服务端响应----浏览器渲染

相关推荐
Miraitowa_cheems1 天前
LeetCode算法日记 - Day 73: 最小路径和、地下城游戏
数据结构·算法·leetcode·职场和发展·深度优先·动态规划·推荐算法
Swift社区1 天前
LeetCode 400 - 第 N 位数字
算法·leetcode·职场和发展
怪兽20141 天前
什么是 Redis?
java·数据库·redis·缓存·面试
Dream it possible!1 天前
LeetCode 面试经典 150_栈_有效的括号(52_20_C++_简单)(栈+哈希表)
c++·leetcode·面试··哈希表
怪兽20141 天前
IntentService 的应用场景和使用方式?
android·面试
摇滚侠1 天前
Spring Boot 3零基础教程,Spring Boot 日志的归档与切割,笔记22
spring boot·redis·笔记
lang201509281 天前
Spring Boot开发利器:devtools全解析(续)
spring boot
皮皮林5511 天前
SpringBoot启动优化7板斧:砍掉70%启动时间的魔鬼实践
spring boot
程序员小凯1 天前
Spring Boot消息队列与事件驱动详解
java·spring boot·后端
编程岁月1 天前
java面试-0141-java反射?优缺点?场景?原理?Class.forName和ClassLoader区别?
java·开发语言·面试