当前位置: 首页 > 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; 本篇文章大部分是来…...

spring boot中实现手动分页

手动分页 UserMapper.xml <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace"cn.m…...

【优选算法】5----有效三角形个数

又是一篇算法题&#xff0c;今天早上刚做的热乎的~ 其实我是想写博客但不知道写些什么&#xff08;就水一下啦&#xff09; -------------------------------------begin----------------------------------------- 题目解析: 这道题的题目算是最近几道算法题里面题目最短的&a…...

C++打字模拟

改进于 文宇炽筱_潜水 c版的打字效果_c自动打字-CSDN博客https://blog.csdn.net/2401_84159494/article/details/141023898?ops_request_misc%257B%2522request%255Fid%2522%253A%25227f97863ddc9d1b2ae9526f45765b1744%2522%252C%2522scm%2522%253A%252220140713.1301023…...

最新版pycharm如何配置conda环境

首先在conda prompt里创建虚拟环境&#xff0c;比如 conda create --prefix E:/projects/myenv python3.8然后激活 conda activate E:/projects/myenv往里面安装点自己的包&#xff0c;比如 conda install pytorch1.7.1 torchvision0.8.2 -c pytorch打开pycharm 注意&#x…...

UML-对象图(Object Diagram)

一、定义 UML对象图用于描述系统中对象的状态和相互关系,是类图的一个实例化版本,主要展示了类图中定义的关系在特定时间点的实际体现。它帮助开发者在设计阶段理解对象之间的实际关系、属性值和状态,从而支持系统设计的准确性与有效性。 二、组成要素 UML对象图主要由以…...

Jmeter 动态参数压力测试时间段预定接口

&#x1f3af; 本文档详细介绍了如何使用Apache JMeter进行压力测试&#xff0c;以评估预定接口在高并发场景下的性能表现。通过创建线程组模拟不同数量的用户并发请求&#xff0c;利用CSV文件动态配置时间段ID和用户token&#xff0c;确保了测试数据的真实性和有效性。文档中还…...

超大型集团合并报表数智管理转型

摘要&#xff1a;数字经济时代&#xff0c;数字化技术已成为驱动财务管理价值释放的重要引擎&#xff0c;数智化能力的提升是当前一流财务信息化建设的最新趋势。财务部门是企业的“数据交汇中心”和“信息加工中心”&#xff0c;通过对企业各项财务数据的分类、汇总和清晰呈现…...

[MCAL]Mcu配置

PostBuild: PreCompile: 选择时钟来源&#xff1b; 选择初始McuInitClock() 函数 电路手册里有晶振频率&#xff0c;如上所示&#xff1b;...

Qt基础项目篇——Qt版Word字处理软件

一、核心功能 本软件为多文档型程序&#xff0c;界面是标准的 Windows 主从窗口 拥有&#xff1a;主菜单、工具栏、文档显示区 和 状态栏。 所要实现的东西&#xff0c;均在下图了。 开发该软件&#xff0c;主要分为下面三个阶段 1&#xff09;界面设计开发 多窗口 MDI 程序…...

算法刷题笔记——图论篇

这里写目录标题 理论基础图的基本概念图的种类度 连通性连通图强连通图连通分量强连通分量 图的构造邻接矩阵邻接表 图的遍历方式 深度优先搜索理论基础dfs 与 bfs 区别dfs 搜索过程深搜三部曲所有可达路径广度优先搜索理论基础广搜的使用场景广搜的过程 岛屿数量孤岛的总面积沉…...