一、为什么要使用Redis?
- 因为它是内存数据库,运行速度快
- 因为它的工作线程是单线程,具有串行化,原子性
- 具有IO模型,天生支撑高并发
- 是kv模型,v具有多个数据结构
- 具有本地方法,可以计算数据移动
- 是二进制安全的,value最大为512MB
二、在百万级的Redis中如何查找key?
查找key有两种方法,第一种是用keys,第二种是scan。keys在数据量比较多的时候,会阻塞服务器,浪费服务器资源,所以通常情况下用scan,scan是一个基于游标的迭代器,它会在用户每次调用时,返回一个包含两个元素的数组,一个是下次迭代的游标,一个是所有迭代的元素,当返回的游标为0时,表示迭代结束。
三、Redis键的过期删除策略
Redis键的过期删除策略有两种:
- 惰性删除:在键过期后不会立即删除,而是在下次请求时扫描这个键是否过期,如果过期就删除,反之,则返回该键
- 定期删除:每隔一段时间扫描数据库,删除里面的过期键,扫描键的数量和数据库数量由算法决定
四、Spring MVC的执行流程
流程大致是:
- 用户向前端控制器发送请求
- 前端控制器接收到请求后调用处理映射器
- 处理器映射器找到具体的处理器,生成处理器对象以及处理器拦截器,再一起返回给前端控制器
- 然后前端控制器调用处理器适配器
- 处理器适配器调用具体的处理器
- 处理器适配器将处理器执行结果ModelAndView返回给前端控制器
- 然后前端控制器将ModelAndView传给视图解析器解析View
- 前端控制器将视图解析器返回的View进行渲染,然后响应给用户
五、Spring Boot自动装载原理
Spring Boot的自动装载主要是通过**@SpringBootApplication注解实现,它包含了==@EnableAutoConfiguration==,该注解从META-INF/spring。factories**文件中读取自动装置类,这些类通过条件注解决定是否要被激活。另外,Spring Boot允许通过配置文件调整自动配置
六、如何解决session问题
JWT将用户的信息封装到一个token令牌中,当每次请求时需要携带token令牌访问
JWT由三个部分组成:头部、负载、签名
头部中就是使用加密算法的签名,负载中存放着需要传递的数据信息
基于Cookie,用户登录后,将Session信息保存在客户端,用户在每次请求的时候,通过客户端的cookie把Session信息带过来
七、布隆过滤器的作用
布隆过滤器是由位数组和哈希函数组成的,通过过个哈希函数将元素映射到位数组的随机位置,主要作用是处理大量任务的筛选任务,主要应用到时预防缓存穿透中,而缓存穿透指的是恶意用户或攻击者通过请求不存在于缓存和后端存储中的数据来使得所有请求都落到后端存储上,导致系统瘫痪。但是通常使用的办法是使用黑名单防止缓存穿透
八、Rabbion中常用的负载均衡算法
主要有四种:轮询、随机、权重、响应时长
九、Rabbion第一次调用为什么会很慢
因为Rabbion默认的是懒加载,它在第一次访问的时候才会去创建LoadBalanceClient,就会导致调用很慢
优化方法就是使用饥饿加载,饥饿加载会在项目启动时加载,降低了第一次访问到耗时时长
十、为什么要使用双token拦截器
双token就是使用了两个token令牌,访问令牌和刷新令牌,这种方法会在提高安全性的同时,优化用户的体验,会更加灵活,更好的管理用户权限
十一、什么是CAP原则
C就是一致性,A是可用性,P是分区容忍性,这三个属性最多只能同时保证其中两个
十二、Nacos配置中心动态刷新原理
- 客户端发起请求:客户端通过后台线程发起一个 HTTP 请求到 Nacos 服务端,用于监听配置变化。
- 服务端挂起连接:Nacos 服务端接收到请求后,会挂起(hold)这个 HTTP 连接一段时间(例如 30 秒),在此期间服务端监控配置文件的变化。
- 无变化情况:若在这段时间内没有检测到配置文件有任何变更,服务端将释放连接并向客户端返回一个指示,表明配置没有更新。
- 配置变更情况:如果在挂起期间检测到配置文件发生变化,服务端会立即释放连接并将最新的配置推送给客户端。
- 循环轮询:无论哪种情况,客户端在接收完响应后,会在短暂延迟(如 10 毫秒)之后重新发起一个新的 HTTP 请求,从而形成循环轮询机制以持续监听配置更新。
十三、负载方案有哪些?
负载方案有两种:
- 服务端负载均衡:在消费者和服务提供放中间使用独立的代理方式进行负载,有硬件(F5)和软件(Nginx、OpenResty)
- 客户端负载均衡:客户端根据自己的请求做负载均衡,Rabbion就属于客户端自己的负载均衡
十四、ES使用场景
- 全文搜索
- 数据分析
- 日志分析与监控
- NoSQL JSON文档数据库
- 搜索推荐
- 地理位置信息
- 大规模监控系统
十五、MongoDB应用场景
做了一个拼车微信小程序,里面用到了MongoDB,用来存储定位信息和订单信息等,还有其他的应用场景比如:
- 网站数据存储
- 游戏开发
- 物流与电商
- 社交网络
- 物联网
- 内容管理系统
- 大数据分析
十六、MyBatis执行流程
- 读取MyBatis的配置文件。mybatis-config.xml为MyBatis的全局配置文件,用于配置数据库连接信息
- 加载映射文件。映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
- 构造会话工厂。通过MyBatis的环境配置信息构建会话工厂SqlSessionFactory。
- 创建会话对象。由会话工厂创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。
- Executor执行器。MyBatis底层定义了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。
- MappedStatement对象。在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。
- 输入参数映射。输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。
- 输出结果映射。输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程。
十七、MyBatis拦截器
有四个拦截器
- Executor(执行器拦截器)
- StatementHandler(语句拦截器)
- ParameterHandler(参数拦截器)
- ResultHandler(结果集拦截器)
拦截的执行顺序也是如上面顺序