Java后端
·2025-06-04Day 3
✅ 今天做了:
面试鸭:
1.RabbitMQ无法路由的消息会去到哪?
如果配置备用交换机,则发送到备用交换机
默认直接丢掉,配置mandatory=true,则将消息返回给生产者
如果配置死信交换机,则发送给死信交换机
2.MySql为什么选用B+树作为索引结构?(B+树的优点)
查询效率高:B+树是自平衡树,插入或删除节点会进行分裂和合并操作,保证树的平衡
减少I/O:B+树非叶子节点存放主键或索引值和指针,可以在内存中存放很多索引,提高缓存命中率,减少I/O
范围查询能力强:B+树叶子节点组成链表,由根节点找到叶子节点后可以循环遍历
拓展:B树与B+树的区别?
B节点存放数据,而B+树只有叶子节点存放数据,非叶子节点存放主键或索引值和指针,在内存中可以存放更多索引
B+树叶子节点构成链表,可以遍历查询,而B树则需要层级遍历
3.一条Sql语句的执行过程?
发送sql语句
连接器校验用户是否有操作权限
分析器进行词法分析和语法分析,词法分析,分析sql的功能如select、update,查询的表如User等。语法分析,分析语法是否
合法
优化器,选择合适的索引,表连接顺序
执行器,判断用户是否有操作表的权限,获取数据并返回
手写RPC框架第3,4章节
了解了接口mock,就是为接口设置一个默认返回值,方便开发和测试,不需要每次测试都真实的写出接口实现。
通过给rpc配置类添加一个mock字段,默认为false,不开启。在代理工厂中,自定义mock代理方法,判断mock字段值,如果为true,则执行mock代理方法,生成Mock代理对象。添加mock代理对象的invoke方法,获取method的返回类型,然后为几种常见的类型范围一个默认数据
了解了自定义序列化器和spi机制,自定义4中序列化器的实现方式。
定义序列化器工厂,需要实现的功能是,传入一个key(序列化器名字,需要规范化,可以写一个接口统一规范序列化器名字),工厂通过名字,从一个Map中获取对应的实现类对象并返回。在invoke时,只需要调用工厂的方法,传入选中的序列化器名字,即可获取对应的序列化器对象。但上述的实现是基于提前将序列化器写死在map中,然后根据key获取对应的序列化器对象。优化,通过配置文件读取,可以再写一个loader加载器。
在META-INF文件中写一个配置文件,配置文件命名需要以Serializer接口的全引用名一致。内部写入 序列化器名=序列化器实现类的全引用名
其目的是为了方便之后读取文件,分割序列化器名字与其对应的全引用名,然后通过反射创建对象。
在Loader中,需要有多个功能:
1.首次加载时,读取配置文件,将序列化器名与其实现类的全引用名以<key,value>的方式存入一个Load Map中
2.根据序列化器key获取对象。为了避免多次创建序列化器实例,应采用单例模式,用一个instanceMap<key,Class<?>>存放序列化器对应的实现类,在获取时,先去判断序列化器key是否存在,不存在就从LoadMap中获取对应的全引用名,然后反射实例化,然后存入instanceMap,返回。
之后,在invoke中,就可以直接调用seralizerFactory的方法getInstance,通过该方法调用序列化器加载器的方法,通过key获得实例。
2
0
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
