腾讯云一面凉经解析

嗨~我是可拟雀,一个全栈开发工程师,毕业于某985大学,目前供职于bat某大厂核心部门后端。每天免费分享最新面经答案,希望在大环境不好的当下能帮到你,让你多积累面试经验。免费分享个人学习2个月速通大厂路线(请看认证标),需要面经合集的请私信我~

1:2道算法 LRU和二进制求和

2:为什么要用中间件

答:解耦:中间件能够将应用程序的不同部分隔离开来,使得各部分之间的依赖关系降低,从而实现解耦。这样,当某一部分发生变化时,不会影响到其他部分,提高了系统的可扩展性和可维护性。

抽象化:中间件能够提供一种抽象化的机制,将底层操作系统的复杂性屏蔽掉,使得应用程序开发人员能够面对一个简单而统一的开发环境。这样,开发人员就可以专注于自己的业务逻辑,而不需要关心底层的细节。

功能扩展:中间件可以方便地添加新的功能,而不需要修改原有的应用程序代码。例如,可以通过添加新的中间件来实现身份验证、授权、日志记录等功能。

提高性能:一些中间件,如缓存中间件、消息队列中间件等,可以提高系统的性能。缓存中间件可以减少对数据库的访问次数,消息队列中间件可以实现异步处理,从而提高系统的响应速度和吞吐量。

统一接口:中间件可以在不同的技术组件之间提供一个统一的接口层,使得系统各部分能够无缝协作,实现跨系统的数据交换和通信。

3:为什么要用redis

高性能:Redis基于内存存储数据,因此其读写速度远超许多传统的关系型数据库,如MySQL。这使得Redis在处理大量数据时能够提供非常快的响应速度。

丰富的数据结构:Redis支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。这些丰富的数据结构可以满足开发过程中各种常见的数据存储需求。

易扩展:Redis支持分布式集群化扩展,这使得它能够在需要处理大量数据时保持高可用性和稳定性。同时,Redis的扩展性极高,只要硬件支持,就可以支撑大量的数据吞吐。

缓解数据库压力:通过将部分数据存储在Redis中,可以作为缓存层,减少对关系型数据库的访问压力。当需要读取数据时,可以先判断Redis中是否有缓存,如果有则直接从Redis中读取,如果没有再去请求数据库,并将数据加入Redis缓存,这样可以大大提高系统访问效率。

持久化保证数据安全性:虽然Redis主要基于内存存储,但它也支持数据持久化,可以将数据写入磁盘,从而在一定程度上保证数据的安全性。

4:你知道redis的底层实现原理吗?

答:先从数据结构回答。可以参考上文。

内存管理:Redis使用jemalloc作为默认的内存分配器,它提供了高效的内存分配和回收机制,可以减少内存碎片和提高内存利用率。此外,Redis还支持内存共享,即多个键值对可以共享相同的值对象,以减少内存占用。

持久化:Redis支持两种持久化方式,即RDB(快照)和AOF(追加日志文件)。RDB是在指定的时间间隔内生成数据集的时间点快照,它可以将数据持久化到磁盘上。AOF则是记录服务器接收到的所有写操作命令,并在服务器启动时通过重新执行这些命令来重建数据集。这两种持久化方式可以单独使用,也可以同时使用,以保证数据的可靠性和完整性。

网络IO:Redis使用单线程模型处理网络IO,这避免了多线程之间的竞态条件和锁开销,从而提高了性能。Redis使用epoll作为默认的IO多路复用技术,它可以高效地处理大量的并发连接和请求。

5:Java线程池的原理?

Java线程池的工作原理主要涉及到两个核心组件:工作线程和任务队列。

当一个新任务被提交到线程池时,线程池会首先检查当前运行的线程数是否少于核心线程数。如果是,那么线程池会创建一个新的工作线程来执行任务,即使其他工作线程处于空闲状态。

如果当前运行的线程数等于或超过核心线程数,线程池会将新提交的任务放入任务队列中。这个队列是一个阻塞队列,用于在执行之前存储任务。

如果任务队列已满,但运行的线程数少于最大线程数,线程池会创建新的线程来处理任务。

如果任务队列已满,且运行的线程数已达到最大线程数,线程池会根据其拒绝策略来处理无法执行的任务。

6:线程池怎么调度线程的?

提交任务:当有新任务提交到线程池时,线程池会首先检查当前运行的线程数是否少于核心线程数。

核心线程处理:如果当前运行的线程数少于核心线程数,线程池会创建新的工作线程来处理任务。即使其他核心线程处于空闲状态,也会创建新线程来处理新任务。

任务队列存储:如果当前运行的线程数等于或超过核心线程数,线程池会将新提交的任务放入任务队列中。任务队列是一个阻塞队列,用于在执行之前存储任务。

非核心线程处理:如果任务队列已满,但运行的线程数少于最大线程数,线程池会创建新的线程(非核心线程)来处理任务。

拒绝策略:如果任务队列已满,且运行的线程数已达到最大线程数,线程池会根据其拒绝策略来处理无法执行的任务。拒绝策略可以是抛出异常、直接丢弃任务、丢弃队列中最旧的任务或执行其他自定义策略。

线程回收:当线程完成任务后,它会变成空闲状态。如果线程池中的线程数量超过核心线程数,并且这些线程在一段时间内(如60秒)没有执行任务,那么这些非核心线程会被销毁,以节省系统资源。

学习的时候应该思考java中的几种线程池及区别。如何用到不同类型的任务队列?核心线程和最大线程的数量关系?都应该能秒答。

免费专栏地址,每日更新,欢迎订阅

#如果再来一次,你还会学硬件吗#
大厂校招实习最新面经解析 文章被收录于专栏

专注于最新各大厂最新面筋解析

全部评论
点赞
送花
回复
分享
发布于 03-13 00:44 湖北

相关推荐

4.1025min1、自我介绍2、常用的编程语言是哪个,自学的还是学校教的?3、ansible自动化配置简单讲讲(项目问题)4、lnmp配置具体出现了什么问题,怎么解决的(php的www.conf和nginx的conf里的用户和组不是一个,导致无法动态转发,通过浏览器返回渲染和nginx日志排错)5、讲讲操作系统的内存管理(我以为是讲讲linux的free命令,罗里吧嗦说了一堆,结果是让讲一些概念,页式存储和段页式存储等)6、TCP三次握手流程7、讲讲容器化技术,镜像和容器分别的概念和区别8、讲讲对k8s的了解9、讲讲你最熟悉哪一块的运维知识(nginx配置相关,面试官提问如果两个url分别访问服务器不同的静态文件该如何实现:include conf 分别写server模块,或者并入nginx主配置文件,但是好像不是这个意思,具体还需学习;nginx的黑名单和白名单如何实现,忘了。。;https和http的区别是什么样的,在nginx配置文件里怎样实现https,也忘了。。。)10、讲讲容器和虚拟机的区别、优点和缺点11、讲讲grep命令,讲讲正则(?和*代表什么),讲讲用shell写过什么样的脚本12、讲讲对zabbix监控系统的理解13、你更想学习、做哪种路线的运维14、你将来的规划是什么样的?15、了解过我们公司业务吗,玩过手游吗,讲讲对游戏业务运维的理解反问环节:1、对容器化技术和k8s的理解程度需要多深?2、有无培训机制?3、常用的linux命令需要多广多深,具体在哪些方面需要多学习一些?更新:4.16收到感谢信
点赞 评论 收藏
转发
10 55 评论
分享
牛客网
牛客企业服务