当前位置: 首页 > news >正文

美团一面面经

第一个问题:介绍一下最近做的项目

第二个问题:我对你项目有个地方比较感兴趣啊。就是你用的那个二级缓存,你的吞吐量有多大啊,为什么需要使用二级缓存?

答: 在二级缓存策略下,笔记详情接口的吞吐量为 9282/s , 平均响应时间为 10ms, 相比较直接走数据库查询,肯定是快的非常多。

第三个问题:缓存和数据库的一致性是如何保证的呢?

第四个问题:Redis是集中缓存,Caffeine是本地缓存,通常来说MQ的消息是机器中的一个实例去消费的,那其他实例的缓存如何解决?

第五个问题:我们在生产环境上它一个服务,可能部署多台机器。消费不会每台机器都消费同一个消息吧,所以你的代码应该考虑这种场景。

第六个问题:什么叫缓存穿透?

当用户访问的数据,既不在缓存中,也不在数据库中,导致请求在访问缓存时,发现缓存缺失,再去访问数据库时,发现数据库也没有要访问的数据,没办法构建缓存数据,来服务后续的请求。当有大量这样的请求到来时,数据库的压力骤增,这就是缓存穿透问题。

第七个问题:讲解一下布隆过滤器的原理

布隆过滤器由[初始值都为0的位图数组]和[N个哈希函数]两部分组成。当我们写入数据库时,在布隆过滤器里做个标记,这样在下次查询数据是否存在数据库时,只需要查询布隆过滤器,如果查询到数据没有被标记,说明不在数据库中。
布隆过滤器会通过3个操作完成标记:

  • 第一步,使用N个哈希函数分别对数据进行哈希计算,得到N个哈希值
  • 第二步,将第一步得到的 N 个哈希值队位图数组的长度取模,得到每个哈希值在位图数组的对应位置、
  • 第三步,将每个哈希值在位图数组的对应位置设置为1。

第八个问题:讲一下令牌桶和漏桶的区别吧。

令牌桶与漏桶算法对比

8.1. 令牌桶(Token Bucket)

  • 工作原理:令牌以固定速率生成并存储在桶中,请求需要消耗令牌来进行处理。令牌可以积攒,允许一定的突发流量。
  • 特性
    • 允许突发流量
    • 请求可以等待令牌
    • 控制流量的平均速率
  • 适用场景:API 限流、网络流量控制、带宽管理等。

8.2. 漏桶(Leaky Bucket)

  • 工作原理:请求进入桶后,以固定速率处理,如果桶满了,新的请求会被丢弃。没有突发流量,输出速率恒定。
  • 特性
    • 不允许突发流量
    • 固定速率输出
    • 超过容量的请求会丢失
  • 适用场景:防止流量洪峰、稳定带宽控制、视频流输出等。

8.3. 令牌桶与漏桶的区别

特性令牌桶(Token Bucket)漏桶(Leaky Bucket)
流量控制允许突发流量,流量灵活不允许突发流量,流量平稳
请求处理请求可以等待令牌请求超出容量会被丢弃
输出速率可变速率,平滑流量恒定速率输出
典型应用API 限流、带宽控制防止流量洪峰、视频流稳定输出
总结:
  • 令牌桶适合平滑控制并允许突发流量的场景。
  • 漏桶适合对输出速率有严格要求并不允许突发流量的场景。

第九个问题: Ratelimiter令牌桶实现流量削峰防止打垮数据库,那么这个令牌桶是本地限流吗还是全局限流?

本项目采用的是本地API进行的局部限流,没有存到Redis进行全局限流。全局限流是不管加多少机器,要求整个服务一秒。

第十个问题:能说一下Java中线程池中有哪些参数以及其中的作用。

第十一个问题:如果使用无界队列作为线程池中的阻塞队列会有什么情况。

如果在线程池中使用 无界队列(如 LinkedBlockingQueue)作为阻塞队列,可能会导致以下几个问题:

  1. 线程池的核心线程无法及时释放

无界队列没有大小限制,意味着可以无限制地接受任务。当任务被提交到线程池时,任务会被放入队列中,即使所有线程池中的工作线程都忙碌,队列也会继续接收新的任务。这样,线程池的核心线程数可能会一直存在,而不会有线程因任务完成而被释放。
结果:线程池的核心线程数不会因为任务排队而减少,可能会导致线程池中的线程始终处于活动状态,浪费系统资源。

  1. 内存占用过大

如果无界队列不断积压任务且没有适当的控制机制(如监控队列长度或主动抛弃任务等),可能会导致内存被任务堆积消耗,甚至导致 内存溢出。虽然无界队列不会像有界队列那样会阻塞新任务的提交,但无止境的任务积压会占用大量内存。
结果:内存消耗增大,可能导致 OutOfMemoryError 或系统性能下降。

  1. 无法控制队列的积压

使用无界队列时,线程池的负载可能无法被有效控制。线程池会尽最大能力执行任务,但是队列会无限制增长,从而影响系统的稳定性。没有队列大小的限制,无法保证任务的积压程度,导致任务可能会一直等待而得不到及时执行。
结果:可能出现某些任务长时间没有执行,系统响应时间不可预测,甚至导致任务丢失(如果不处理好队列)。

  1. 可能导致线程池过载

在一些极端情况下,如果系统不断提交任务而没有足够的工作线程来执行这些任务,尽管线程池会尝试分配空闲线程执行任务,但由于无界队列的存在,任务会无限制地积压,这就会导致线程池的负载过重,可能导致 资源耗尽(如 CPU 和内存等)。
结果:系统的性能会严重下降,甚至可能崩溃。

  1. 任务的延迟执行

无界队列可能导致任务的执行延迟,因为任务会被推入队列中等待执行,而队列的大小没有限制,可能会导致任务在队列中等待很长时间。虽然不会立即丢失任务,但任务的执行时间变得不可预测,系统的响应性降低。
6. 没有流量控制

有界队列能够有效地控制队列中的任务量,防止提交过多任务给线程池。而无界队列则没有这个控制能力,线程池可能会因为接收过多任务而导致过载,这样无法动态地应对高负载的情况。

解决方法:

使用有界队列:可以为队列设置大小限制,防止任务积压过多。常用的有界队列如 ArrayBlockingQueue。
使用自定义拒绝策略:当队列满时,可以通过 RejectedExecutionHandler 设置拒绝策略,抛弃任务、抛出异常、或者直接将任务提交到外部队列等。
动态调整线程池大小:可以通过合理的核心线程数和最大线程数来控制线程池的并发能力,避免过度并发。

总的来说,使用无界队列时需要谨慎,合理配置线程池和队列,确保系统的稳定性和性能。如果没有适当的流量控制和任务限制机制,可能导致系统过载、内存消耗过大或者任务积压问题。

相关文章:

美团一面面经

第一个问题:介绍一下最近做的项目 第二个问题:我对你项目有个地方比较感兴趣啊。就是你用的那个二级缓存,你的吞吐量有多大啊,为什么需要使用二级缓存? 答: 在二级缓存策略下,笔记详情接口的吞…...

什么是报文的大端和小端,有没有什么记忆口诀?

在计算机科学中,**大端(Big-Endian)和小端(Little-Endian)**是两种不同的字节序(即多字节数据在内存中的存储顺序)。理解这两种字节序对于网络通信、文件格式解析以及跨平台编程等非常重要。 1…...

Spring中BeanFactory和ApplicationContext的区别

目录 一、功能范围 二、Bean的加载时机 三、国际化支持 四、事件发布 五、资源加载 六、使用场景说明 在Spring框架中,BeanFactory和ApplicationContext是两种常见的容器实现方式,它们在功能和使用场景上存在一些显著的差异。本文将详细解析这两种容…...

期货行业专题|基于超融合实现 IT 基础设施现代化与国产化转型实践合集

SmartX 期货行业重要进展 帮助近 60 家期货用户部署 730 超融合节点,含 230 信创节点。 深入 5 大应用场景: 核心生产资源池 主席灾备资源池 信创云资源池 云原生存储与容器资源池 分布式存储资源池 更多超融合金融核心生产业务场景实践&#xf…...

AI新玩法:Flux.1图像生成结合内网穿透远程生图的解决方案

文章目录 前言1. 本地部署ComfyUI2. 下载 Flux.1 模型3. 下载CLIP模型4. 下载 VAE 模型5. 演示文生图6. 公网使用 Flux.1 大模型6.1 创建远程连接公网地址 7. 固定远程访问公网地址 前言 在这个AI技术日新月异的时代,图像生成模型已经成为了创意工作者和开发者手中…...

Jenkins-pipeline Jenkinsfile说明

一. 简介: Jenkinsfile 是一个文本文件,通常保存在项目的源代码仓库中,用于定义 Jenkins Pipeline 的行为。使用 Jenkinsfile 可以使 CI/CD 流程版本化,并且易于共享和审核。 二. 关于jenkinsfile: jenkins的pipeline…...

vue3中为什么引入setup,引入setup是为了解决什么问题,setup的执行时机是什么?返回值是什么

在 Vue 3 中,引入 setup 函数是为了提供一种更加简洁、灵活、逻辑分离和可维护的方式来组织组件的逻辑。setup 使得 Vue 3 在构建应用时,能够更加有效地支持组合式 API(Composition API),解决了 Vue 2 中一些组件逻辑组…...

Ubuntu 安装 docker 配置环境及其常用命令

Docker 安装与配置指南 本文介绍如何在 Ubuntu 系统上安装 Docker,解决权限问题,配置 Docker Compose,代理端口转发,容器内部代理问题等并进行相关的优化设置。参考官方文档:Docker 官方安装指南 一、安装 Docker 1…...

自动化01

测试用例的万能公式:功能测试界面测试性能测试易用性测试安全性测试兼容性测试 自动化的主要目的就是用来进行回归测试 新产品--第一个版本 (具备丰富的功能),将产品的整体进行测试,人工创造一个自动化测试用例,在n个版本的时候…...

音频入门(二):音频数据增强

本文介绍了一些常见的音频数据增强方法,并给出了代码实现。 目录 一、简介 二、代码 1. 安装必要的库 2. 代码 3. 各函数的介绍 4. 使用方法 参考: 一、简介 音频数据增强是机器学习和深度学习领域中用于改善模型性能和泛化能力的技术。 使用数据…...

MySQL管理事务处理

目录 1、事务处理是什么 2、控制事务处理 (1)事务的开始和结束 (2)回滚事务 (3)使用COMMIT (4)使用保留点 (5)结合存储过程的完整事务例子 3、小结 …...

MySQL数值型函数详解

简介 本文主要讲解MySQL数值型函数,包括:ROUND、RAND、ABS、MOD、TRUNCATE、CEIL、CEILING、FLOOR、POW、POWER、SQRT、LOG、LOG2、LOG10、SIGN、PI。 本文所有示例中,双横杠左边为执行的SQL语句,右边为执行语句的返回值。 ROU…...

54.DataGrid数据框图 C#例子 WPF例子

首先是绑定一个属性&#xff0c;属性名称无所谓。到时候看属性设置的啥&#xff0c;可能要改。 <DataGrid ItemsSource"{Binding Index_instance}"/> 然后创建INotifyPropertyChanged的类&#xff0c;并把相关固定的代码粘贴上去。 然后把这个目录类建好&am…...

总结6..

背包问题的解决过程 在解决问题之前&#xff0c;为描述方便&#xff0c;首先定义一些变量&#xff1a;Vi表示第 i 个物品的价值&#xff0c;Wi表示第 i 个物品的体积&#xff0c;定义V(i,j)&#xff1a;当前背包容量 j&#xff0c;前 i 个物品最佳组合对应的价值&#xff0c;同…...

复位信号的同步与释放(同步复位、异步复位、异步复位同步释放)

文章目录 背景前言一、复位信号的同步与释放1.1 同步复位1.1.1 综述1.1.2 优缺点 1.2 recovery time和removal time1.3 异步复位1.3.1 综述1.3.2 优缺点 1.4 同步复位 与 异步复位1.5 异步复位、同步释放1.5.1 总述1.5.2 机理1.5.3 复位网络 二、思考与补充2.1 复…...

Gartner发布2025年网络治理、风险与合规战略路线图

新型网络风险和合规义务&#xff0c;日益成为网络治理、风险与合规实践面临的问题。安全和风险管理领导者可以参考本文&#xff0c;实现从被动、专注于合规的方法到主动、进一步自动化方法的转型。 主要发现 不断变化的监管环境和不断扩大的攻击面&#xff0c;使企业机构难以实…...

基于STM32的智能空气质量监测与净化系统设计

目录 引言系统设计 硬件设计软件设计 系统功能模块 空气质量检测模块自动净化模块数据显示与用户交互模块远程监控与数据上传模块 控制算法 空气质量检测与判断算法净化设备控制算法数据记录与远程反馈算法 代码实现 空气质量检测与显示代码自动净化与调节代码数据上传与远程控…...

人工智能之数学基础:线性代数中的线性相关和线性无关

本文重点 在线性代数的广阔领域中,线性相关与线性无关是两个核心概念,它们对于理解向量空间、矩阵运算、线性方程组以及人工智能等问题具有至关重要的作用。 定义与直观理解 当存在一组不全为0的数x1,x2,...,xn使得上式成立的时候,那么此时我们可以说向量组a1,a2...,an…...

08 工欲善其事必先利其器—常用类

1 字符串相关 1.1 String 所属包&#xff1a;java.lang 代表不可变的字符序列 注意&#xff1a;Java中&#xff0c;String是一个final类 1&#xff09;创建字符串方式 String a "hello"; // 开辟内存空间 String b new String("hello"); String d…...

Redis实战-初识Redis

初识Redis 1、Redis简介2、 Redis数据结构简介3、 Redis命令3.1 字符串3.2 列表3.3 集合3.4 散列3.5 有序集合3.6 发布与订阅3.7 其他命令3.7.1 排序3.7.2 过期时间 如有侵权&#xff0c;请联系&#xff5e; 如有错误&#xff0c;也欢迎批评指正&#xff5e; 本篇文章大部分是来…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...