美团一面面经
第一个问题:介绍一下最近做的项目
第二个问题:我对你项目有个地方比较感兴趣啊。就是你用的那个二级缓存,你的吞吐量有多大啊,为什么需要使用二级缓存?
答: 在二级缓存策略下,笔记详情接口的吞吐量为 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)作为阻塞队列,可能会导致以下几个问题:
- 线程池的核心线程无法及时释放
无界队列没有大小限制,意味着可以无限制地接受任务。当任务被提交到线程池时,任务会被放入队列中,即使所有线程池中的工作线程都忙碌,队列也会继续接收新的任务。这样,线程池的核心线程数可能会一直存在,而不会有线程因任务完成而被释放。
结果:线程池的核心线程数不会因为任务排队而减少,可能会导致线程池中的线程始终处于活动状态,浪费系统资源。
- 内存占用过大
如果无界队列不断积压任务且没有适当的控制机制(如监控队列长度或主动抛弃任务等),可能会导致内存被任务堆积消耗,甚至导致 内存溢出。虽然无界队列不会像有界队列那样会阻塞新任务的提交,但无止境的任务积压会占用大量内存。
结果:内存消耗增大,可能导致 OutOfMemoryError 或系统性能下降。
- 无法控制队列的积压
使用无界队列时,线程池的负载可能无法被有效控制。线程池会尽最大能力执行任务,但是队列会无限制增长,从而影响系统的稳定性。没有队列大小的限制,无法保证任务的积压程度,导致任务可能会一直等待而得不到及时执行。
结果:可能出现某些任务长时间没有执行,系统响应时间不可预测,甚至导致任务丢失(如果不处理好队列)。
- 可能导致线程池过载
在一些极端情况下,如果系统不断提交任务而没有足够的工作线程来执行这些任务,尽管线程池会尝试分配空闲线程执行任务,但由于无界队列的存在,任务会无限制地积压,这就会导致线程池的负载过重,可能导致 资源耗尽(如 CPU 和内存等)。
结果:系统的性能会严重下降,甚至可能崩溃。
- 任务的延迟执行
无界队列可能导致任务的执行延迟,因为任务会被推入队列中等待执行,而队列的大小没有限制,可能会导致任务在队列中等待很长时间。虽然不会立即丢失任务,但任务的执行时间变得不可预测,系统的响应性降低。
6. 没有流量控制
有界队列能够有效地控制队列中的任务量,防止提交过多任务给线程池。而无界队列则没有这个控制能力,线程池可能会因为接收过多任务而导致过载,这样无法动态地应对高负载的情况。
解决方法:
使用有界队列:可以为队列设置大小限制,防止任务积压过多。常用的有界队列如 ArrayBlockingQueue。
使用自定义拒绝策略:当队列满时,可以通过 RejectedExecutionHandler 设置拒绝策略,抛弃任务、抛出异常、或者直接将任务提交到外部队列等。
动态调整线程池大小:可以通过合理的核心线程数和最大线程数来控制线程池的并发能力,避免过度并发。
总的来说,使用无界队列时需要谨慎,合理配置线程池和队列,确保系统的稳定性和性能。如果没有适当的流量控制和任务限制机制,可能导致系统过载、内存消耗过大或者任务积压问题。
相关文章:
美团一面面经
第一个问题:介绍一下最近做的项目 第二个问题:我对你项目有个地方比较感兴趣啊。就是你用的那个二级缓存,你的吞吐量有多大啊,为什么需要使用二级缓存? 答: 在二级缓存策略下,笔记详情接口的吞…...
什么是报文的大端和小端,有没有什么记忆口诀?
在计算机科学中,**大端(Big-Endian)和小端(Little-Endian)**是两种不同的字节序(即多字节数据在内存中的存储顺序)。理解这两种字节序对于网络通信、文件格式解析以及跨平台编程等非常重要。 1…...
Spring中BeanFactory和ApplicationContext的区别
目录 一、功能范围 二、Bean的加载时机 三、国际化支持 四、事件发布 五、资源加载 六、使用场景说明 在Spring框架中,BeanFactory和ApplicationContext是两种常见的容器实现方式,它们在功能和使用场景上存在一些显著的差异。本文将详细解析这两种容…...

期货行业专题|基于超融合实现 IT 基础设施现代化与国产化转型实践合集
SmartX 期货行业重要进展 帮助近 60 家期货用户部署 730 超融合节点,含 230 信创节点。 深入 5 大应用场景: 核心生产资源池 主席灾备资源池 信创云资源池 云原生存储与容器资源池 分布式存储资源池 更多超融合金融核心生产业务场景实践…...

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

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

复位信号的同步与释放(同步复位、异步复位、异步复位同步释放)
文章目录 背景前言一、复位信号的同步与释放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年网络治理、风险与合规战略路线图
新型网络风险和合规义务,日益成为网络治理、风险与合规实践面临的问题。安全和风险管理领导者可以参考本文,实现从被动、专注于合规的方法到主动、进一步自动化方法的转型。 主要发现 不断变化的监管环境和不断扩大的攻击面,使企业机构难以实…...
基于STM32的智能空气质量监测与净化系统设计
目录 引言系统设计 硬件设计软件设计 系统功能模块 空气质量检测模块自动净化模块数据显示与用户交互模块远程监控与数据上传模块 控制算法 空气质量检测与判断算法净化设备控制算法数据记录与远程反馈算法 代码实现 空气质量检测与显示代码自动净化与调节代码数据上传与远程控…...

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

08 工欲善其事必先利其器—常用类
1 字符串相关 1.1 String 所属包:java.lang 代表不可变的字符序列 注意:Java中,String是一个final类 1)创建字符串方式 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 过期时间 如有侵权,请联系~ 如有错误,也欢迎批评指正~ 本篇文章大部分是来…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

简约商务通用宣传年终总结12套PPT模版分享
IOS风格企业宣传PPT模版,年终工作总结PPT模版,简约精致扁平化商务通用动画PPT模版,素雅商务PPT模版 简约商务通用宣传年终总结12套PPT模版分享:商务通用年终总结类PPT模版https://pan.quark.cn/s/ece1e252d7df...

Axure Rp 11 安装、汉化、授权
Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接:https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…...

Linux系统:进程间通信-匿名与命名管道
本节重点 匿名管道的概念与原理匿名管道的创建命名管道的概念与原理命名管道的创建两者的差异与联系命名管道实现EchoServer 一、管道 管道(Pipe)是一种进程间通信(IPC, Inter-Process Communication)机制,用于在不…...
AIGC 基础篇 Python基础 02
1.bool类型 书接上回,我们上次最后讲了三大数据类型,除了这三个之外,Python也有bool类型,也就是True和False。 a 2 print(a1) print(a2) 像这里,输出的内容第一个是False,因为a的值为2,而第…...

Tableau for mac 驱动
Tableau 驱动程序安装指南 对于希望在 Mac OS 上使用 Tableau 进行数据分析的用户来说,确保正确安装相应的驱动程序至关重要。Tableau 支持多种数据库连接方式,并提供官方文档指导如何设置这些连接。 安装适用于 Mac 的 JDBC 或 ODBC 驱动程序 为了使…...
慢慢欣赏linux 之 last = switch_to(prev, next)分析
last switch_to(prev, next); 为什么需要定义last作为调用switch_to之前的prev的引用 原因如下: struct task_struct * switch_to(struct task_struct *prev,struct task_struct *next) {... ...return cpu_switch_to(prev, next);> .global cpu_switch_tocpu_…...