腾讯云一面凉经解析

嗨~我是可拟雀,一个全栈开发工程师,毕业于某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 湖北

相关推荐

10 54 评论
分享
牛客网
牛客企业服务