文章目录
1.项目的高并发在哪里有所体现?
项目里面的抢券逻辑涉及到高并发,优惠力度大,单词访问量激增,这里用到了lua脚本判断库存,用户是否下单,是否一人一单,CAS控制库存,redission分布式锁保证一人一单。
2.为什么采用redis实现登录功能
可能后续项目扩增,如果是单纯session登录,在集群环境下就会存在问题,因为你session只是存储在一台机器的jvm内存中,其他机器无法感知,基于redis,所有机器可以从redis里获取
3.jwt登录这块在项目中如何做的呢?如果两个人登录同一个账户,后面登录的把之前登录的挤下线,你会怎么做?
1.jwt首先是前端发送登录请求,后端判断,通过后就生成一个jwt令牌返回给前端,jwt(header,payload,signature),前端保存到localstorage/sessionsotorage中,每次请求接口都携带这个jwt,后端拦截器校验,通过则放行。
- 用户登录吧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请求---服务端响应----浏览器渲染