今天是毕业后的第一次正式面试,又是大获失败的一次面试,先说一下根据我的回答问的问题。
闲余时间
- 肯定是提升自己的专业知识啊(不敢说打游戏)
- 一旦你说了你在闲余时间学习,就开始问你学了什么,然后从深度和广度询问你所学的技术,这里说一下问我的几个问题。
Redis
有哪些常用数据类型?
- String(字符串)
- Hash(哈希)
- List(列表)
- Set(集合)
- zset(有序集合)
为什么这么快?
- 基于内存存储实现
- 高效的数据结构
- 合理的数据编码
- 单线程 + 多路 IO 复用技术
- 多路 IO 复用:多个网络连接复用同一个线程完成I/O请求
- 单线程: redis 的网络 I/O 的读取与数据库操作都在同一个线程中完成
- 虚拟内存机制
- 暂时把冷数据放到磁盘
Redis的常用应用场景
- 缓存
- 排行榜
- 计数器应用
- 共享Session
- 分布式锁
- 社交网络
- 消息队列
- 位操作
缓存击穿,缓存穿透,缓存雪崩的概念?
-
缓存穿透
-
缓存穿透是指缓存和数据库中都没有的数据,⽽⽤户不断发起请求,如发起为id为“-1”的数据或id为特别⼤不存在的数据。这时的⽤户很可能是攻击者,攻击会导致数据库压⼒过⼤。
-
解决方案:接⼝层增加校验,如⽤户鉴权校验,id做基础校验,id<=0的直接拦截
-
-
缓存击穿
- 缓存击穿是指缓存中没有但数据库中有的数据(⼀般是缓存时间到期),这时由于并发⽤户特别多,同时读缓存没读到数据,⼜同时去数据库去取数据,引起数据库压⼒瞬间增⼤,造成过⼤压⼒
- 解决方案:
- 设置热点数据永远不过期。
- 加互斥锁(根据 key 取缓存数据为 null 则获取锁,获取成功就从数据库获取数据然后设置到缓存,最后释放锁,如果没获取到锁就进程睡眠一段时间再去获取数据,理论上来说能够根据 key 加锁就更好了)
-
缓存雪崩
- 缓存雪崩是指缓存中数据⼤批量到过期时间,而查询数据量巨大,引起数据库压⼒过⼤甚至down机。和缓存击穿不同的是,缓存击穿指并发查同⼀条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从⽽查数据库。
- 解决方案:
- 缓存数据的过期时间设置随机,防⽌同⼀时间⼤量数据过期现象发⽣。
- 如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。
- 设置热点数据永远不过期。
Mybatis
# 和 $ 的主要区别
#
为占位符,$
为字符串拼接
常用哪个,为什么
- 一般用
#
,因为$
有 sql 注入的风险
下面说一下问到的通用的问题
Springboot
常用注解有哪些?
- Resource,SpringbootApplication,Conditional,Service,Controller,Requestbody,PathVariable,EnableAutoConfiguration
为什么用它
- 简化 Spring 应用的开发,嵌入的 Tomcat 无需部署 war 文件
- 大量的自动配置,简化开发,也可修改默认值
- 与主流框架集成性较好
为什么能自动配置
- 主要起源于 @SpringBootApplication,它包含了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan,
- Springboot 是通过 @EnableAutoConfiguration 注解开启自动配置的,该注解通过对 jar 包下的spring.factories 文件进行扫描,这个文件包含了可以进行自动配置的类,当满足@Condition注解指定的条件时,便在依赖的支持下进行实例化,注册到 Spring 容器中。
还有一些通用的问题
数据库
事务的基本特性
- 原子性
事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一,要么都成功,要么都失败。
任何一项操作都会导致整个事务的失败,同时其它已经被执行的操作都将被撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成。 - 一致性
事务的一致性是指事务在执行时不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。
比如:张三给李四转钱,不可能张三被扣了钱,李四没有加钱。 - 隔离性
事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同事物并非操作相同数据时,每个事务都有完整的数据空间。
一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的。 - 持久性
事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态。
谈一下聚簇索引与非聚簇索引
- 拿查字典做一个比喻,字典的页面就好比是物理排列顺序,物理排列顺序是固定的,查询的方式就好比是索引,区别是聚簇索引就好比是拼音查询,每一个字母查询出来的页面顺序是跟你字母的顺序一致的,a字母查询出来的页面一定是在c字母查询出来的页面前面,而非聚簇索引就好比是笔画查询,笔画少的查出来的页面不一定在笔画多的查出来的页面前面,也就是你通过笔画查询的顺序和页面的顺序并不是一致的。
- 聚簇索引:
- 索引和数据是放在一块的(一个文件存储,主键索引的B+树的叶子节点中存放了索引值和数据行所有字段)
- 索引的顺序和数据的物理存储一致(因为字段也在B+树的叶子节点中,因此索引按序则整个数据行也是按序的)
- 非聚簇索引:
- 索引和数据是分开存放的(两个文件存储,索引的B+树的叶子节点中只存放了索引值和指向对应数据行的物理地址)
- 索引的顺序和数据的物理存储不一致(B+树中的索引值是按序的,但指针中的对应数据行的物理地址并不是按序的)
其他
地址栏输入一个地址到页面渲染完成会发生哪些事?
- 浏览器解析 URL
- 建立 HTTP 请求
- 这个阶段的主要工作分为:DNS解析和通信链路的建立
- DNS解析:获取目标服务器 IP 地址
- 反向代理服务器根据客户的请求,从后端服务器上获取资源后提供给客户端
- 后端验证请求并返回数据
- 页面渲染
谈一下负载均衡
- 分布式系统中,A 服务需要调用 B 服务,B 服务在多台机器中存在,A 可以调用任意一个服务器完成功能,但是为了每个服务器不要太忙或者太闲,就需要负载均衡地调用每一个服务器,提高网站的健壮性