小红书八股面经一份(JAVA开发)

1. zmysql索引结构

mysql索引底层采用的是b+树的结构,一开始mysql的索引采用的是b树的结构,当数据量达到一定程度的时候,b树存在深度过大的问题,那么磁盘io次数就会飞速上升,导致查询效率慢。b+树就很好的解决了这个问题,比如存储2000万条数据的时候,b+树的实际存储深度也就3,4层,实际上就是通过减少树的深度来减少查询时的io次数,io实际上是一个重操作。能少就少,查询才能快起来

2. 索引有哪些类型

索引主要分为4大类

  • 按数据结构分:b+,hash,full-text
  • 按物理存储分:主键、二级索引
  • 按字段特性:主键、唯一、普通、前缀
  • 按字段个数:单列、联合

比较常用的就是主键索引、前缀索引、联合索引

3. 布隆过滤器概念及原理

概念:布隆过滤器是一种用来快速判断数据是否在某个集合的数据结构,实际上就是一段位数组加上几个哈希函数组成的结构

优点:布隆过滤器不存储数据本身,并且是通过位数组的形式进行数据的位标记,运算快,节省内存空间

缺点:存在误判的可能,判断在不一定在,但是判断不在就一定不在,并且删除起来困难。存储原理如下图

同一个位置上可能存在多个变量映射到同一个位置

eg:ka经过三个哈希函数映射到了3,4,7.

但是3,4,7在上次存储kakuqo的时候已经标记成为1了,那么系统会判断ka存在,实际上ka是不存在的

3.1. 应用场景

import java.util.BitSet;public class MyBloomFilter {/*** 位数组的大小*/private static final int DEFAULT_SIZE = 2 << 24;/*** 通过这个数组可以创建 6 个不同的哈希函数*/private static final int[] SEEDS = new int[]{3, 13, 46, 71, 91, 134};/*** 位数组。数组中的元素只能是 0 或者 1*/private BitSet bits = new BitSet(DEFAULT_SIZE);/*** 存放包含 hash 函数的类的数组*/private SimpleHash[] func = new SimpleHash[SEEDS.length];/*** 初始化多个包含 hash 函数的类的数组,每个类中的 hash 函数都不一样*/public MyBloomFilter() {// 初始化多个不同的 Hash 函数for (int i = 0; i < SEEDS.length; i++) {func[i] = new SimpleHash(DEFAULT_SIZE, SEEDS[i]);}}/*** 添加元素到位数组*/public void add(Object value) {for (SimpleHash f : func) {bits.set(f.hash(value), true);}}/*** 判断指定元素是否存在于位数组*/public boolean contains(Object value) {boolean ret = true;for (SimpleHash f : func) {ret = ret && bits.get(f.hash(value));}return ret;}/*** 静态内部类。用于 hash 操作!*/public static class SimpleHash {private int cap;private int seed;public SimpleHash(int cap, int seed) {this.cap = cap;this.seed = seed;}/*** 计算 hash 值*/public int hash(Object value) {int h;return (value == null) ? 0 : Math.abs((cap - 1) & seed * ((h = value.hashCode()) ^ (h >>> 16)));}}
}

4种实现布隆过滤器的方式,可自行选择:布隆过滤器四种实现(Java,Guava,hutool,Redisson)_hutool 布隆过滤器-CSDN博客

4. 操作系统读文件流程

  1. 用户发起文件读取请求,操作系统处理文件系统定位文件、检查权限等
  2. 查文件控制块(FCB),存储了文件读写位置,文件大小、文件存储位置等信息
  3. 启动DMA进行数据传输,操作系统把数据源地址+目标地址给DMA,DMA把数据从硬盘读到内存缓冲区,CPU不参与数据传输,由DMA进行数据交换
  4. DMA根据配置采用合适的传输模式,块传输or周期盗用模式,传输完后通知cpu已完成
  5. 数据从内存缓冲区传到用户空间,用户完成文件读取后更新文件控制块里的读写指针
  6. 释放资源避免内存泄漏问题

总结:DMA技术把数据从硬件传到内存,避免cpu参与,提高数据传输效率,减少读取文件的时间

5. 为系统记录日志,侵入式和不侵入式的做法

5.1. 侵入式

AOP定义切面+连接点,在方法前后加入特定逻辑

@Aspect
@Component
public class LoggingAspect {@Before("execution(* com.example.service.*.*(..))")public void logBefore(JoinPoint joinPoint) {System.out.println("Method " + joinPoint.getSignature().getName() + " is called with arguments: " + Arrays.toString(joinPoint.getArgs()));}@After("execution(* com.example.service.*.*(..))")public void logAfter(JoinPoint joinPoint) {System.out.println("Method " + joinPoint.getSignature().getName() + " finished.");}
}

5.2. 非侵入式

5.2.1. 动态代理

通过动态代理或静态代理去包装目标对象,实现方法调用时自动记录日志,这种方式不会修改原有代码实现,只是在方法调用前后添加日志

Java 动态代理(JDK Proxy)可以用于接口类型的类,CGLIB(字节码生成库)可以用于类类型的代理。

import java.lang.reflect.*;public class LoggingHandler implements InvocationHandler {private Object target;public LoggingHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Calling method " + method.getName() + " with args: " + Arrays.toString(args));Object result = method.invoke(target, args);System.out.println("Method " + method.getName() + " executed, result: " + result);return result;}
}public class Service {public void doSomething(String msg) {System.out.println("Doing something: " + msg);}
}public class ProxyExample {public static void main(String[] args) {Service service = new Service();Service proxy = (Service) Proxy.newProxyInstance(service.getClass().getClassLoader(),service.getClass().getInterfaces(),new LoggingHandler(service));proxy.doSomething("Hello, World!");}
}
5.2.2. 拦截器模式

通过在请求进入前或方法执行后拦截请求并执行日志记录

@Component
public class LoggingInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("Request URL: " + request.getRequestURL());return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("Response Status: " + response.getStatus());}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("Request processing complete.");}
}
5.2.3. 事件监听实现日志记录

主要流程有

  1. 定义事件类 该类用于存储你要记录的关于方法的信息,例如方法名称、参数等
import org.springframework.context.ApplicationEvent;public class MethodExecutionEvent extends ApplicationEvent {private String methodName;public MethodExecutionEvent(Object source, String methodName) {super(source);this.methodName = methodName;}public String getMethodName() {return methodName;}
}
  1. 发布事件
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;@Service
public class SomeService {@Autowiredprivate ApplicationEventPublisher eventPublisher;public void someMethod(String param) {// 这里发布 MethodExecutionEvent 事件eventPublisher.publishEvent(new MethodExecutionEvent(this, "someMethod"));// 执行方法的实际逻辑System.out.println("Executing someMethod with param: " + param);}
}
  1. 监听事件 监听器 MethodExecutionListener 就会捕获 MethodExecutionEvent 事件并执行相应的处理
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;@Component
public class MethodExecutionListener {@EventListenerpublic void onMethodExecutionEvent(MethodExecutionEvent event) {System.out.println("Method executed: " + event.getMethodName());}
}

6. @transactional注解加载A上,A调用B,此时发生异常,a和b会不会撤回事务


面经来源于牛客网 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16569.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis 缓存击穿问题与解决方案

前言1. 什么是缓存击穿?2. 如何解决缓存击穿?怎么做?方案1: 定时刷新方案2: 自动续期方案3: 定时续期 如何选? 前言 当我们使用redis做缓存的时候,查询流程一般是先查询redis,如果redis未命中,再查询MySQL,将MySQL查询的数据同步到redis(回源),最后返回数据 流程图 为什…

路由过滤方法与常用工具

引言 在前面我们已经学习了路由引入&#xff0c;接下来我们就更进一步来学习路由过滤 前一篇文章&#xff1a;重发布&#xff1a;路由引入&#xff08;点击即可&#xff09; 路由过滤 定义&#xff1a;路由器在发布或者接收消息时&#xff0c;可能需要对路由信息进行过滤。 作用…

网络分析工具—WireShark的安装及使用

Wireshark 是一个广泛使用的网络协议分析工具&#xff0c;常被网络管理员、开发人员和安全专家用来捕获和分析网络数据包。它支持多种网络协议&#xff0c;能够帮助用户深入理解网络流量、诊断网络问题以及进行安全分析。 Wireshark 的主要功能 数据包捕获与分析&#xff1a; …

anolis os 8.9安装jenkins

一、系统版本 # cat /etc/anolis-release Anolis OS release 8.9 二、安装 # dnf install -y epel-release # wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo # rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.…

Java 进阶day14XML Dom4j 工厂模式 Base64

目录 知识点1、XML 概念XML约束 知识点2、XML解析 Dom4j&#xff08;Dom for java&#xff09;XPath 知识点3、工厂模式知识点4、Base64 知识点1、XML 概念 XML的全称为&#xff08;eXtensible Markup Language&#xff09;&#xff0c;是一种可扩展的标记语言。 XML的作用…

软件测试面试题及答案解析,2025最新版

1、什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行&#xff0c;即是通常说的软件的可移植性。 兼容的类型&#xff0c;如果细分的话&#xff0c;有平台的兼容&#xff0c;网络兼容&#xff0…

【云安全】云原生-K8S- kubeconfig 文件泄露

什么是 kubeconfig 文件&#xff1f; kubeconfig 文件是 Kubernetes 的配置文件&#xff0c;用于存储集群的访问凭证、API Server 的地址和认证信息&#xff0c;允许用户和 kubectl 等工具与 Kubernetes 集群进行交互。它通常包含多个集群的配置&#xff0c;支持通过上下文&am…

无人机遥感图像拼接及处理实践技术:生态环境监测、农业、林业等领域,结合图像拼接与处理技术,能够帮助我们更高效地进行地表空间要素的动态监测与分析

近年来&#xff0c;无人机技术在遥感领域的应用越来越广泛&#xff0c;尤其是在生态环境监测、农业、林业等领域&#xff0c;无人机遥感图像的处理与分析成为了科研和业务化工作中的重要环节。通过无人机获取的高分辨率影像数据&#xff0c;结合图像拼接与处理技术&#xff0c;…

网络工程师 (33)VLAN注册协议——GVRP协议

前言 VLAN注册协议——GVRP&#xff08;GARP VLAN Registration Protocol&#xff09;是一种用于在网络中动态管理VLAN成员关系的网络协议。 一、基本概念 GVRP是GARP&#xff08;Generic Attribute Registration Protocol&#xff0c;通用属性注册协议&#xff09;的一种具体应…

在实体机和wsl2中安装docker、使用GPU

正常使用docker和gpu&#xff0c;直接命令行安装dcoker和&#xff0c;nvidia-container-toolkit。区别在于&#xff0c;后者在于安装驱动已经cuda加速时存在系统上的差异。 1、安装gpu驱动 在实体机中&#xff0c;安装cuda加速包&#xff0c;我们直接安装 driver 和 cuda 即可…

使用stm32控制esp01s

title: 使用stm32控制esp01s date: 2025年2月9日 18:41:20 tags: 单片机模块使用 categories: stm32 description: 使用stm32控制esp01s连接WiFi查看内容等操作 前言 使用stm32f103控制esp01s是步入物联网的第一步&#xff0c;接下来的文章会详细讲解如何使用stm32控制esp01s…

PT8042 双触控双输出触摸 IC

1. 产品概述 PT8042 是一款电容式触摸控制 ASIC &#xff0c;支持双通道触摸输入和双路同步开关输出&#xff0c;可引脚配置 同步输出的有效电平。 PT8042 实现触摸同步开关控制。适用于雾化器、车载用品、电子玩具、 消费类电子产品等领域&#xff0c;具有低功耗、高抗…

【AI学习】DeepSeek-R1-Distill的意义和影响

在写完上一篇文章《DeepSeek为什么这么火爆&#xff1f;解密梁文锋的深谋远虑》后&#xff0c;又想到了一个新的问题。 在DeepSeek R1的技术报告中&#xff0c;还有这样一个技术&#xff1a;蒸馏赋予小模型推理能力。这项技术的意义和影响是什么&#xff1f; 先看看这个技术&…

qml ToolBar详解

1、概述 在 QML 中&#xff0c;ToolBar 是一种常用的 UI 组件&#xff0c;通常位于窗口的顶部或底部&#xff0c;用于提供一系列的操作按钮、菜单或其他交互元素。它可以帮助用户快速访问应用程序的常用功能&#xff0c;提高用户操作的便捷性。ToolBar 可以包含多个 ToolButto…

视频理解新篇章:Mamba模型的探索与应用

人工智能咨询培训老师叶梓 转载标明出处 想要掌握如何将大模型的力量发挥到极致吗&#xff1f;叶老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具&#xff08;限时免费&#xff09;。 1小时实战课程&#xff0c;您将学习到如何轻松上手并有效利用 Llama Facto…

Flutter项目试水

1基本介绍 本文章在构建您的第一个 Flutter 应用指导下进行实践 可作为项目实践的辅助参考资料 Flutter 是 Google 的界面工具包&#xff0c;用于通过单一代码库针对移动设备、Web 和桌面设备构建应用。在此 Codelab 中&#xff0c;您将构建以下 Flutter 应用。 该应用可以…

LVS作业

1、对比 LVS 负载均衡群集的 NAT 模式和 DR 模式&#xff0c;比较其各自的优势 。 NAT 模式 部署与管理优势 配置简易&#xff1a;在 NAT 模式中&#xff0c;负载均衡器主要承担网络地址转换的工作&#xff0c;只需配置简单的 NAT 规则&#xff0c;就能实现将外部请求合理地转…

从零开始手写Shell:详解命令行解释器的实现原理

Shell的本质认知 命令行解释器&#xff08;Shell&#xff09;是操作系统的"翻译官"&#xff0c;它的核心工作流程可以抽象为&#xff1a; 循环 {1. 显示提示符2. 获取命令输入3. 解析命令参数4. 执行命令程序 }本实现仅需200行C代码&#xff0c;却能完整展现Shell的…

mysql读写分离与proxysql的结合

上一篇文章介绍了mysql如何设置成主从复制模式&#xff0c;而主从复制的目的&#xff0c;是为了读写分离。 读写分离&#xff0c;拿spring boot项目来说&#xff0c;可以有2种方式&#xff1a; 1&#xff09;设置2个数据源&#xff0c;读和写分开使用 2&#xff09;使用中间件…

机器学习10-卷积和卷积核3

机器学习10-卷积和卷积核3 纹理表示卷积神经网络全链接神经网络的瓶颈卷积网络中的卷积操作特征响应图组尺寸计算 池化操作示例 图像增强翻转随机缩放抠图色彩抖动其他方案1. 平移2. 旋转3. 拉伸4. 径向畸变5. 裁剪 纹理表示 如何去表示纹理&#xff1f; 基于卷积核组的纹理表…