【面试总结】八股①
目录
- 数据库
- 缓存穿透是什么
- 常见的sql调优方法有哪些
- 使用表的别名为什么能优化查询性能
- MySQL事务特性是哪些
- 事务隔离级别有哪些
- Java基础
- StringBuffer和StringBuilder的区别
- String直接引号新建和new String新建的区别
- Java中继承和实现的各种关系
- 消息队列
- Redis
- 计算机常识
- 缓冲击穿是什么
- 布隆过滤器是什么
- 进程间通信的方式有几种
- TCP和UDP区别
数据库
缓存穿透是什么
缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。解决缓存穿透的方法包括使用布隆过滤器,将可能访问的 key 存储在布隆过滤器中,不存在的 key 则直接被过滤掉,以及设置热点数据永远不过期等。
常见的sql调优方法有哪些
SQL调优的技巧和策略可以优化数据库查询性能,提高查询速度和效率。以下是一些常见的SQL调优技巧:
- 使用索引:使用索引可以大大提高查询速度,可以通过为表创建索引来优化查询性能。
- 避免使用having字句:having字句会在检索出所有记录之后才对结果集进行过滤,而使用WHERE字句可以在聚合前筛选记录,减少开销。
- 使用表的别名:当在SQL语句中连接多个表时,使用表的别名并把别名前缀于每个列名上,可以优化查询性能。
- 调整where子句中的连接顺序:DBMS一般采用自下而上的顺序解析where子句,根据这个原理,表连接最好写在其他where条件之前,可以过滤掉最大数量记录。
- 将多条SQL语句压缩到一句SQL中:每次执行SQL的时候都要建立网络连接、进行权限校验、进行SQL语句的查询优化、发送执行结果,这个过程是非常耗时的,因此应该尽量避免过多的执行SQL语句,能够压缩到一句SQL执行的语句就不要用多条来执行。
- 使用增量查询:使用SELECT name, age FROM user WHERE id > #{lastId} LIMIT 100;查询比上次id大的100条记录。
- 高效分页:可以使用SELECT id, name, age FROM user LIMIT 10000, 20;查询10020条记录,然后丢弃前面10000条记录,或者使用SELECT id, name, age FROM user WHERE id > 10000 LIMIT 20;找到上次分页最大id。
使用表的别名为什么能优化查询性能
- 表别名能够简化SQL语句,提高可读性。
- 表别名能够缓解查询优化器在执行查询时所需的开销。在复杂的查询中,如果没有使用别名,优化器可能需要执行更多的工作来确定如何最有效地执行查询。通过使用别名,可以为优化器提供更多的信息,帮助它更有效地生成查询执行计划。
- 表别名可以提高查询性能。在某些数据库系统(如MySQL)中,使用别名可以将表连接顺序提前确定,从而减少服务器需要解析查询表中字段及其相关值所需的时间,提高查询速度。
MySQL事务特性是哪些
MySQL事务具有以下四个特性:
- 原子性(Atomicity):事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
- 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
- 隔离性(Isolation):当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。关于事务的隔离性数据库提供了多种隔离级别,详见《MySQL事务隔离级别和实现原理》。
- 持久性(Durability):一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
这些特性确保了数据库的数据一致性和完整性,以及事务的可重复性和可靠性。
事务隔离级别有哪些
事务隔离级别有四种:
- Serializable (串行化):这是最严格的隔离级别,事务串行执行,资源消耗最大。
- Repeatable Read (重复读):保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。
- Read Committed (提交读):大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。
- Read Uncommitted (未提交读):事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”、“幻读”和“不可重复读取”。
这四种隔离级别是逐渐降低的,更高的隔离级别可以提供更多的数据一致性保证,但同时也会牺牲更多的性能。选择哪个隔离级别通常需要根据具体的应用需求和性能要求来决定。
Java基础
StringBuffer和StringBuilder的区别
StringBuffer和StringBuilder都是Java中用来处理字符串的类,它们的主要区别在于是否线程安全。StringBuffer是线程安全的,而StringBuilder不是。这意味着在多线程环境中,使用StringBuffer更加安全,因为它可以防止数据被并发修改。另一方面,由于StringBuilder不是线程安全的,所以它的性能通常会比StringBuffer更好。以下是StringBuffer和StringBuilder之间其他一些重要的区别:
- 缓冲区大小:StringBuffer的缓冲区大小是固定的,而StringBuilder的缓冲区大小则是动态的。
- 效率:对于大量的字符串操作,StringBuilder比StringBuffer更有效率,因为StringBuffer的所有方法都是同步的,这会在多线程环境下增加额外的开销。
- 适用场景:如果程序是多线程的,或者你需要频繁地修改字符串,那么使用StringBuffer更好。如果你只是进行单线程的字符串操作,或者需要频繁地创建和修改字符串,那么使用StringBuilder会更高效。
String直接引号新建和new String新建的区别
使用双引号定义字符串和使用new关键字创建字符串对象有一些区别,主要表现在内存分配和字符串池的使用上。
- 内存分配:当你使用双引号定义字符串时,如 String s = “abc”,Java会在字符串缓冲池中查找是否有一个存储着相同内容的字符串的对象,如果存在,那么Java就会返回该对象,如果不存在,就会在堆内存中创建一个新的字符串对象,并将该对象放入字符串缓冲池中。而当你使用new关键字创建字符串对象时,如 String s = new String(“abc”),Java会在堆内存中创建一个新的字符串对象,不论字符串缓冲池中是否存在相同内容的字符串对象。
- 字符串池的使用:使用双引号定义字符串时,Java会先在字符串池中查找是否存在相同的内容,如果存在就直接返回地址,如果不存在则在堆中创建一个新的对象,然后在字符串池中添加这个新的对象。使用new关键字创建字符串时,每次都会在堆内存中创建一个新的对象。
总的来说,使用双引号创建字符串更有效率,因为它能共享相同内容的对象。而使用new关键字创建的每个字符串对象都会占用独立的内存空间。因此,建议在实际编程中尽可能使用双引号来定义字符串。
Java中继承和实现的各种关系
在 Java 中,一个类只能继承一个类,这被称为单继承。但是,Java支持多重继承,即一个类可以实现多个接口,一个类可以实现任意数量的接口。
接口可以继承接口,抽象类可以实现接口,但不可以继承接口。接口可以继承多个接口public interface C extends A, B {}
。抽象类可以实现(implements)一个或多个接口public abstract class MyClass implements A, B {}
。抽象类不能继承一个具体的类,但可以继承一个抽象类或实现一个接口public abstract class MyClass extends AbstractClass implements A {}
。
抽象类中可以对方法进行实现。从Java 8开始,接口也可以定义默认方法和静态方法。抽象类可以实现方法,但这些方法只能被抽象类本身和其非抽象子类使用。
// 定义一个接口,其中包含默认方法和静态方法
public interface MyInterface { // 默认方法 default String defaultMethod() { return "This is a default method in the interface."; } // 静态方法 static String staticMethod() { return "This is a static method in the interface."; }
} // 实现接口的类
public class MyClass implements MyInterface { public static void main(String[] args) { // 调用接口的默认方法 System.out.println(MyInterface.defaultMethod()); // 调用接口的静态方法 System.out.println(MyInterface.staticMethod()); }
}// 定义一个抽象类,其中包含一个抽象方法和一个具体方法
public abstract class MyAbstractClass { // 抽象方法 public abstract void abstractMethod(); // 具体方法 public void concreteMethod() { System.out.println("This is a concrete method in the abstract class."); }
} // 实现抽象类的类
public class MyClass extends MyAbstractClass { // 实现抽象方法 @Override public void abstractMethod() { System.out.println("This is the implementation of the abstract method in the subclass."); }
}
消息队列
Redis
计算机常识
缓冲击穿是什么
缓冲击穿是电容器的故障现象之一,指的是电容器在运行过程中,由于长时间超过额定电压,导致电容器内部绝缘材料性能下降,电容器内部出现击穿短路的现象。为了避免这种情况发生,电容器通常会采用串联电抗器或放电电阻等保护装置,以限制电流和电压的幅值,避免电容器因过电压而损坏。
布隆过滤器是什么
布隆过滤器(Bloom Filter)是一种很长的二进制向量和一系列随机映射函数。它用于检索一个元素是否在一个集合中。布隆过滤器的主要优点是空间效率和查询时间都比一般的算法要好的多。它的主要缺点是有一定的误识别率和删除困难。
进程间通信的方式有几种
进程间通信的八种方式:
- 管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。它分为无管道单工通信方式和有管道单工通信方式两种。此外,无名管道(pipe)也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
- 高级管道(pipe):高级管道是一种半双工的通信方式,数据只能单向流动,但是它可以在不同进程间传递。它分为发送端和接收端两个部分,通过将发送端和接收端连接起来实现通信。
- 信号(signal):信号是一种比较复杂的通信方式,它允许一个进程向另一个进程发送一个信号,通知该进程某个事件已经发生。接收到信号的进程可以根据信号的类型进行处理。
- 信号量(semaphore):信号量是一个计数器,可以用来控制多个线程对共享资源的访问,因此主要用于进程间或线程的同步。
- 消息队列(message queue):消息队列是一种消息的链表,存放在内核中并由消息队列标识符标识。它克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点,可以进行大量数据的传输。
- 套接字(socket):套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
- 共享内存(shared memory):共享内存是一种高效的进程间通信方式。多个进程可以通过共享内存来读写同一块物理内存空间,从而实现高效的通信。共享内存必须在具有亲缘关系的进程间使用。
- 消息信箱(message box):消息信箱是一种可以进行跨进程通信的数据结构。一个进程可以发送消息到消息信箱,而另一个进程可以从该消息信箱中接收消息。
TCP和UDP区别
TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种互联网协议,它们都用于在网络上传输数据,但是它们之间有一些显著的区别,如下:
- 连接方式:TCP是面向连接的协议,每次通信前需要建立连接,数据传输完后需要释放连接;UDP则是无连接的协议,不需要建立和释放连接,直接发送数据包。
- 可靠性:TCP是可靠的协议,能够保证数据传输的可靠性。当数据丢失或损坏时,TCP会自动重传丢失的数据,保证数据的完整性;UDP则是不可靠的协议,数据包在传输过程中有可能丢失、重复或损坏,不保证数据传输的可靠性。
- 传输速度:UDP比TCP传输速度更快,因为UDP没有TCP的重传机制、流量控制机制和拥塞控制机制,减少了额外的开销。
- 数据包大小:TCP数据包大小不限,可以根据网络状况动态调整;UDP的数据包大小有限制,最大只能达到64K。
- 应用场景:TCP适用于对数据可靠性要求较高的场景,如文件传输、邮件发送等;UDP适用于对实时性要求较高的场景,如音频、视频等实时传输。
相关文章:
【面试总结】八股①
目录 数据库缓存穿透是什么常见的sql调优方法有哪些使用表的别名为什么能优化查询性能MySQL事务特性是哪些事务隔离级别有哪些 Java基础StringBuffer和StringBuilder的区别String直接引号新建和new String新建的区别Java中继承和实现的各种关系 消息队列Redis计算机常识缓冲击穿…...

AI绘画 | 一文学会Midjourney绘画,创作自己的AI作品(快速入门+参数介绍)
一、生成第一个AI图片 首先,生成将中文描述词翻译成英文 然后在输入端输入:/imagine prompt:Bravely running boy in Q version, cute head portrait 最后,稍等一会即可输出效果 说明: 下面的U1、U2、U3、U4代表的第一张、第二张…...
MongoDB 数据库详细介绍
MongoDB 数据库详细介绍 MongoDB(来自“Humongous”,意为巨大的)是一个开源、高性能、无模式(NoSQL)、文档导向的分布式数据库。它以其灵活性、可扩展性和强大的查询功能而闻名于世。MongoDB 使用 JSON 格式的文档来存…...

Qt在mac安装
先在app store下载好Xcode 打开Xcode 随便建个文件给它取个名字找个地方放提醒没建立git link,不用理他打开终端, 输入/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"...

STM32 F103C8T6学习笔记1:开发环境与原理图的熟悉
作为一名大学生,学习单片机有一段时间了,也接触过嵌入式ARM的开发,但从未使用以及接触过STM32C8T6大开发使用,于是从今日开始,将学习使用它~ 本文介绍STM32C8T6最小系统开发环境搭建注意问题,STM32C8T6单片…...

【Linux命令详解 | ps命令】 ps命令用于显示当前系统中运行的进程列表,帮助监控系统状态。
文章标题 简介一,参数列表二,使用介绍1. 基本用法2. 显示所有进程3. 显示进程详细信息4. 根据CPU使用率排序5. 查找特定进程6. 显示特定用户的进程7. 显示进程内存占用8. 查看进程树9. 实时监控进程10. 查看特定进程的详细信息11. 查看特定用户的进程统计…...

“超越传统的HTTP请求:深度解析Axios,打造前端开发的终极利器“
解锁前端开发的新境界 - 深入探索Axios,构建卓越的互联网应用 在当今数字化世界中,互联网应用的需求日益增长,而无论是大型企业还是初创公司,都需要一个强大而可靠的工具来处理与后端服务器之间的通信。这就是Axios的光辉时刻。作…...

【Tomcat】tomcat的多实例和动静分离
多实例: 在一台服务器上有多台Tomcat;就算是多实例 安装telnet服务,可以用来测试端口通信是否正常 yum -y install telnettelnet 192.168.220.112 80 tomcat的日志文件 cd /usr/local/tomcat/logsvim catalina.out Tomcat多实例部署&…...

Python爬虫IP代理池的建立和使用
写在前面 建立Python爬虫IP代理池可以提高爬虫的稳定性和效率,可以有效避免IP被封锁或限制访问等问题。 下面是建立Python爬虫IP代理池的详细步骤和代码实现: 1. 获取代理IP 我们可以从一些代理IP网站上获取免费或付费的代理IP,或者自己租…...
Java面试题(dubbo)
目录 什么是dubbo?为什么要用? dubbo的使用场景和核心功能? dubbo核心组件 dubbo服务注册与发现的流程 dubbo与spring的关系 dubbo与springCloud的区别 dubbo有哪些注册中心? dubbo使用的什么通讯框架? dubbo…...
JVM源码剖析之Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded异常
写在前面: 版本信息: jdk版本:jdk8u40 垃圾回收器:ParallelScavenge new/old最近在群里看到有一位老哥拿着异常信息到处问,而发生的就是java.lang.OutOfMemoryError: GC overhead limit exceeded异常,恰好…...

使用PDF文件入侵任何操作系统
提示:我们8月28号开学,所以我得快点更新了,不能拖了😥 文章目录 前言一、打开终端总结 前言 PDF文件被广泛应用于共享信息,电子邮件,网站或文档或存储系统的真实链接 它可以用于恶意软件的载体。 不要问我什么意思&am…...

强训第32
选择 D B A A 发送TCP意思应该是已经建立了连接,会超时重传。在未建立连接的时候,会放弃该链接 C A 80端口是http A 交换机攻击主要有五种:VLAN跳跃攻击 生成树攻击 MAC表洪水攻击 ARP攻击 VTP攻击 B A 2^(32-26)2^(32-27)2^(32-27)128 减去…...

vue3 setup+Taro3 调用原生小程序自定义年月日时分多列选择器,NutUI改造
vue3 setupTaro3 调用原生小程序自定义年月日时分多列选择器,NutUI改造 NutUI 有日期时间选择器,但是滑动效果太差,卡顿明显。换成 原生小程序 很顺畅 上代码: <template><view><pickermode"multiSelector&…...

git命令使用
君子拙于不知己,而信于知己。——司马迁 清屏:clear 查看当前面板的路径:pwd 查看当前面板的文件:ls 创建文件夹:mkdir 文件夹名 创建文件:touch 文件名 删除文件夹:rm -rf 文件夹名 删除文件:r…...

每日记--前端解决方案--el-select下拉样式-el-option内容过长-鼠标悬停到文字不修改光标样式-设置透明
文章目录 el-select下拉样式el-select中el-option内容过长解决办法鼠标悬停到文字不修改光标样式设置透明 el-select下拉样式 element-ui自带样式设置popper-class el-select中el-option内容过长解决办法 问题:像这样选项太长了,不好看 解决…...

Windows系统Git安装教程(详细Git安装过程)
获取Git安装程序 到Git官网下载,网站地址:https://git-scm.com/downloads,如下图: 因为我们是用Windows系统上的浏览器访问的,Git官网自动之别到了我使用的操作系统,所以右侧直接显示下载使用Windows系统的…...

前后端分离------后端创建笔记(11)用户删除
B站视频:30-用户删除&结束语_哔哩哔哩_bilibili 1、现在我们要做一个删除的功能 1.1 首先做一个删除的功能接口,第一步先来到后端,做一个删除的接口 2、删除我们用Delete请求 3、方法名我给他改一下 3.1这里给他调一下删除方法…...

24、springboot的自动配置01--类条件注解@ConditionalOnClass、bean条件注解@ConditionalOnBean
springboot的自动配置 ★ 自动配置 Spring Boot的自动配置通常可根据依赖库自动触发——当Spring Boot检测到项目中包含某些框架的JAR包时,Spring Boot就会触发自动配置。其实通过EnableAutoConfiguration注解来启动▲ 其实你用到SpringBootApplication࿰…...

婚恋交友h5多端小程序开源版开发
婚恋交友h5多端小程序开源版开发 以下是婚恋交友H5多端小程序的功能列表: 用户注册和登录:用户可以通过手机号码或第三方账号注册和登录。个人信息填写:用户可以填写个人基本信息,包括姓名、性别、年龄、身高、体重、学历、职业等…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...