怎么样推广一个网站,大连城乡建设网站,网页源代码查看答案,免费自助建站软件个人评价
秃狼觉得本次的面试是有史以来难度最大的#xff0c;问了很多陌生的八股文#xff0c;项目问的比较少#xff0c;估计是项目本来就没有什么亮点#xff0c;也是第一次被面试官说菜的面试。不过在后续的学习上还是收获颇丰的。
1.说说你在实习中遇到的难点吧问了很多陌生的八股文项目问的比较少估计是项目本来就没有什么亮点也是第一次被面试官说菜的面试。不过在后续的学习上还是收获颇丰的。
1.说说你在实习中遇到的难点吧
我们的实现项目主要就是做C端的在线教育项目也是因为我是实习生的原有我没有去负责黄金链路也就是从用户登录到用户下单课程最后到用户观看视频的整个流程。我主要负责辅助模块的开发包括 评论点赞视频点播模块的开发。
我说说我印象比较深的难点当时需求就是完成续播的效果在我们的点播记录表中会记录观看到的位置因为我们视频播放采用的是腾讯VOD来实现的也就是视频的长度使用整型表示 。并且上级的要求误差要控制在30秒之内。续播的功能本质就是操作数据库并且前端每隔15秒就会提交对应的观看位置如果直接打数据库的话请求量大的话最终就会压垮数据库。为了解决这个问题我们通过讨论使用的解决方案就是 redis的hash结构 定时任务来解决的。本质就是减少DB操作redis的hash结构大key存储课表id课表id用于关联课程和userId小key存储节的Id,value存储观看的位置。在每次发送请求的时候都修改hash结构并且使用RabbitMq的死信队列实现的延迟信息延迟15秒、发送一个当前的观看位置的消息。在监听到消息之后使用当前的观看位置和消息中的观看位置如果二者相同的话就说明当前15内没有再观看了这时候去修改数据库反之丢掉对应的消息。在性能的上减少了99%的db操作。
2.在做合并写请求的时候RabbitMq发送消息的速度大于消费者消费的速度怎么解决
本质上就是消费者的消费速度小于生产速度。解决这个问题的主要方案就是增加我们的消费者个数加快消费者的消费速度对我们消息队列进行扩容。
1.增加消费者个数因为项目采用的是微服务落地方案所以我们可以增加消费者的节点。
2.加快消费者的消费速度我们可以创建线程池创建多线程进行消费。
3.消息队列进行扩容当在默认情况下我们的消息队列不足的时候我们可以对消息队列进行扩容可以使用惰性队列进行扩容因为惰性队列使用磁盘进行存储所以在读取的时候速度上比较慢所以还是要根据业务情况进行选择。
3.在Spring中怎么解决循环依赖的问题
Spring中使用三级缓存来解决缓存依赖一级缓存主要就是存储完整的实例二级缓存主要就是次存储代理对象三级缓存就是ObjectFactory。当A和B相互依赖的时候就是使用三级缓存。
加载A并将A的ObjectFactory存放到三级缓存去加载B并将B的ObjectFactory存放到三级缓存中。当发现B中需要依赖A此时将使用A的ObjectFactory生成A的代理对象,并将A的代理对象存放到二级缓存中将A注入到B中将完整的B存放到一级缓存中此时回溯将完整的B注入到A中最终解决三级缓存的问题。
4.Spring中的事务有了解过吗
Spring的事务主要解决的问题就是并发事务带来的问题。
Spring的实现方式主要就是使用Aop的来实现的使用环绕通知在执行方法的时候开启事务并对执行的方法使用Try/catch如果捕获异常的话就进行回滚如果执行完方法后就进行提交。
Spring中的事务传播性主要包括 Propagation_Required公用同一个事务Propagation_Required_new(开启新事务)Propagation_nested在住事务中内嵌子事务当主事务不存在的时候就会创建新事务。
5.动态代理的流程有了解过吗
动态代理主要就是JDK动态代理和CGLIB动态代理被当代理对象有实现接口的时候就会直接使用JDK的动态代理当被代理对象没有实现接口的时候就会使用CGLIB的动态代理将继承被代理对象的子类作为代理对象。
6.B树和B树的区别
B树会在每一个节点上存放数据而B树则在叶子节点存储数据。
区别最大的我认为是因为B树在结构特性导致在做范围查询的时候需要多次从根节点出发而B树则不需要。并且在做排序的时候B树也很方便因为叶子节点使用双向链表进行存储。
7.Spring中的设计模式有哪些
单例模式我比较了解就是Spring中IOC默认情况下采用的就是单例模式。
工厂模式和策略模式我们当时在实现动态获取分布式锁及对应策略使用自定义注解工厂模式策略模式。自定义注解主要就是控制对应的枚举。我们会创建一个工厂类里面有一个属性EunmMapkey存储对应的枚举value存储对应分布式锁的实现方法最终设置枚举即可获得对应的类。策略模式则就会在枚举中编写一个抽象方法会有多个方法实现该抽象方法最终这些实现的方法就是策略。
责任链模式最常见的就是Stream流式编程通过返回原型继续执行方法。
8.voliate是线程安全的吗
voliate主要解决的就是线程共享变量的可见性及防止指令重排序。
当我们的程序在执行很大的循环时由于JIT的优化机制就会使大循环变成无限循环导致线程间无法读取到修改后的共享变量。也是因为JDK优化的问题为了提高运行效率在执行指令的时候会对指令进行重排序。
但是呢voliate在执行的过程中不遵循原子性所以不是线程安全的。