面经学习(越亮传奇实习)

个人评价

有两个面试官,两个面试官气场还是挺强的,八股文还是问的比较多的,整体的难度还是比较小的。

介绍一下实习项目吧? (合并写请求)

的实习项目主要就是做C端的在线教育项目,并且呢,它采用的基于alibaba那套落地的微服务方案。可能也是因为我是实习生的源固,我没有负责黄金链路,从用户登录到用户下单再到用户观看视频的整个流程,我主要负责的就是负责辅助模块的开发。评论区,点赞,排行榜模块的开发。

那我给您介绍一下我记得比较清楚的难点吧。

当时要做一个续播功能,也就是用户切换其他设备的时候也能从对应的位置上继续观看,本质上就是去修改数据库中观看记录表的数据,在刚刚开始的想法就是直接去操作数据库,对了,每个用户前端每隔15秒会提交一次观看位置的请求,并且上级这边说qps会达到3000左右,也就是同时观看人数最多会有3000人左右,因此我们要进行优化,我们会发现这些请求中只有最后一次的观看位置是有用的,所以设计的解决方案就是使用redis的hash结构+延迟消息来实现的。Hash结构中,使用大key存储课表Id,课表用来关联userId和课程的Id,使用小key存储节Id,value存储观看位置的数据,在每次请求进来后直接修改Hash中的数据,并且每次发送一个延迟消息,使用RabbitMq的死信发送一个延迟15秒消息,并且也是当前的节点去监听该消息,监听到消息后,使用监听到的观看位置和当前在Hash结构中的观看位置进行比较,如果发现二者的相同,说明在这15秒内没有再次进行观看了,这个时候就去修改数据库。反之,如果不相同的话,说明此时用户还在进行观看,我们就直接丢掉消息。最终减少99%的DB操作。

那我在做完这个业务之后,也在思考,因为我们使用的是RabbitMq来存储观看位置的消息,此时可能就会出现问题,消费者的消费速度小于生成者生成速度。我目前主要了解到的解决方案就是增加消费者的个数,因为采用的是微服务的落地方案,所以我们可以增加消费者的个数。提升消费者的消费能力,我会创建线程池,使用多线程来消费消息,对消息队列进行扩容,我们可以使用惰性队列来存储消息,因为惰性队列使用磁盘进行存储,就导致它的容量非常大,但是呢,涉及到大量的文件IO操作,所以在速度上效率是比较低的。

设计模式你了解过哪些?

单例模式:我比较了解就是Spring中IOC默认情况下采用的就是单例模式。

工厂模式和策略模式:我们当时在实现动态获取分布式锁及对应策略,使用自定义注解+工厂模式+策略模式。自定义注解主要就是控制对应的枚举。我们会创建一个工厂类,里面有一个属性EunmMap,key存储对应的枚举,value存储对应分布式锁的实现方法,最终设置枚举即可获得对应的类。策略模式则就会在枚举中编写一个抽象方法,会有多个方法实现该抽象方法,最终这些实现的方法就是策略。

责任链模式:最常见的就是Stream流式编程,通过返回原型继续执行方法。

在Spring中怎么解决循环依赖的问题?

Spring中使用三级缓存来解决缓存依赖,一级缓存主要就是存储完整的实例,二级缓存主要就是次存储代理对象,三级缓存就是ObjectFactory。当A和B相互依赖的时候就是使用三级缓存。

加载A,并将A的ObjectFactory存放到三级缓存,去加载B,并将B的ObjectFactory存放到三级缓存中。当发现B中需要依赖A,此时将使用A的ObjectFactory生成A的代理对象,并将A的代理对象存放到二级缓存中,将A注入到B中,将完整的B存放到一级缓存中,此时回溯,将完整的B注入到A中,最终解决三级缓存的问题。

redis的缓存问题有了解过吗?

主要就是三个问题就是缓存穿透,缓存击穿,缓存雪崩。

1.缓存击穿:当某个热点key突然过期导致大量的请求打db,最终压垮我们的数据库。

解决方案:使用分布式锁来解决,在每次访问数据库前都会获取缓存如果缓存不存在就会上锁然后做db操作,保证每次只有一个请求打数据库。

2.缓存雪崩:有两种情况,当大量的key设置了相同的过期时间,导致大量的key同时过期,导致到大量的请求大db,最终压垮数据库,或者是redis服务宕机了。

解决方案:redis搭建集群,搭建二级缓存,错开过期时间。

3.缓存穿透:一些数据,即不存在于数据库中,又不存在于redis中,在每次查询的时候都不会创建缓存,导致后续查询的时候都走数据库。

解决方案:使用布隆过滤器,因为它是基于BitMap来实现的,通过位置0和1来判断数据是否存在,这样就可以保证不会直接走数据库,防止压垮数据库。

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我可以为你提供一些关于 Unity 实习面经的信息。以下是一些常见的问题和主题,可能会在 Unity 实习面试中提及: 1. Unity 基础知识:面试官可能会问你关于 Unity 的基础知识,比如游戏对象、组件、场景、动画等的概念。 2. C# 编程:Unity 使用 C# 作为主要编程语言,所以你可能会被问到关于 C# 的基本语法、面向对象编程等方面的问题。 3. Unity API 和功能:面试官可能会问到你对 Unity API 的了解程度,以及你是否熟悉常用的 Unity 功能,比如碰撞检测、物理模拟、粒子系统等。 4. 游戏开发经验:如果你有相关的游戏开发经验,面试官可能会询问你参与过的项目、你在项目中扮演的角色、遇到的挑战以及如何解决问题等。 5. 问题解决能力:面试官可能会给你一些实际的问题场景,并评估你解决问题的能力和思维过程。这可能涉及到编程逻辑、算法设计或解决技术性问题的能力。 6. 项目展示:如果你有自己的作品或项目,面试官可能会要求你展示项目的代码、设计思路和实现过程。 7. 其他技术:除了 Unity 和 C#,你可能会被问到其他相关的技术,比如游戏设计原则、图形学基础、网络编程等。 这些只是一些常见的问题和主题,具体的面试内容可能因公司和职位要求而有所不同。提前准备并熟悉这些问题,可以帮助你在面试中更好地展示自己的能力和经验。祝你面试顺利!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值