面试问题记录

1.多线程,线程池

1.如何创建线程

  • 实现 Runnable 接口,重写run方法;
  • 实现 Callable 接口,重写call方法;
  • 继承 Thread 类,重写run方法。

2.基础线程机制

Executors:可以创建四种类型的线程池:

  • CachedThreadPool:带缓存的线程池,每来一个任务创建一个线程;
  • FixedThreadPool:所有任务只能使用固定大小的线程;
  • SingleThreadExecutor:相当于大小为 1 的 FixedThreadPool。
  • ScheduledThreadPool:可以执行延迟任务的线程池 。

Daemon:守护线程

sleep:休眠方法

yield:声明了当前线程已经完成了生命周期中最重要的部分,可以切换给其它线程来执行

3.线程中断

  • 调用interrupt()方法,抛出 InterruptedException异常
  • 调用interrupted()方法,设置线程的中断标记
  • 调用 Executor 的 shutdown() 方法

4.线程的状态

新建、可运行、阻塞、无限期等待、限期等待、死亡

5.线程之间的协作

  • join()
  • wait()、notify()
  • await()、signal()

6.同步

  1. 锁的实现
    synchronized 是 JVM 实现的,而 ReentrantLock 是 JDK 实现的。
  2. 性能
    新版本 Java 对 synchronized 进行了很多优化,例如自旋锁等,synchronized 与 ReentrantLock 大致相同。
  3. 等待可中断
    当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情。
    ReentrantLock 可中断,而 synchronized 不行。
  4. 公平锁
    公平锁是指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁。synchronized 中的锁是非公平的,ReentrantLock 默认情况下也是非公平的,但是也可以是公平的。
  5. 锁绑定多个条件
    一个 ReentrantLock 可以同时绑定多个 Condition 对象。

2.Redis的内容,Redis的持久化机制,存的set数据太多有什么问题

1.Redis的数据类型

String、List、Set、ZSet、Hash

2.数据结构

跳表,跳表是基于多指针有序链表实现的,可以看成多个有序链表。

与红黑树等平衡树相比,跳跃表具有以下优点:

  • 插入速度非常快速,因为不需要进行旋转等操作来维护平衡性;
  • 更容易实现;
  • 支持无锁操作。

缺点:

  • 空间复杂度较高: 跳表需要维护多层索引,因此在存储上需要更多的空间。
  • 不适合频繁插入删除: 在频繁插入和删除元素的情况下,维护跳表的索引结构可能会变得复杂,导致性能下降。

3.使用场景

排行榜、缓存、分布式锁

4.内存淘汰策略

  • noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键
  • allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键
  • volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键
  • allkeys-random:加入键的时候如果过限,从所有key随机删除
  • volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐
  • volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键
  • volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键
  • allkeys-lfu:从所有键中驱逐使用频率最少的键

5.持久化机制

  • RDB持久化:将某个时间点的所有数据都存放到硬盘上。可以将快照复制到其它服务器从而创建具有相同数据的服务器副本。如果系统发生故障,将会丢失最后一次创建快照之后的数据。
  • AOF持久化:将写命令添加到 AOF 文件的末尾。使用 AOF 持久化需要设置同步选项,从而确保写命令同步到磁盘文件上的时机。
    always 选项会严重减低服务器的性能;
    everysec 选项比较合适,可以保证系统崩溃时只会丢失一秒左右的数据,并且 Redis 每秒执行一次同步对服务器性能几乎没有任何影响;
    no 选项并不能给服务器性能带来多大的提升,而且也会增加系统崩溃时数据丢失的数量。

6.set存数据太多的问题

  1. 内存消耗: Redis 是内存数据库,存储大量的 Set 数据会占用大量的内存资源。如果数据量超出了可用内存,可能导致 Redis 无法正常工作,甚至系统崩溃。
  2. 持久化成本: 如果启用了持久化机制(如快照或日志持久化),存储大量的数据会导致持久化操作变得耗时,并可能影响系统的响应性能。
  3. 数据传输开销: 当数据量较大时,在网络传输数据时可能会引起显著的网络开销,影响数据传输的效率和速度。
  4. 查询性能: 对大型 Set 进行复杂查询可能会影响查询性能,增加响应时间,特别是在数据集不适合全部加载到内存的情况下。

应对:数据分片、压缩、调整持久化配置、进行性能监控和调优

3.MySQL索引,为什么选择B+树,如果用B树,红黑树,缺点是什么

1.数据结构:B+树

2.为什么选择B+树

  • B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具有 B Tree 的平衡性,并且通过顺序访问指针来提高区间查询的性能。
  • B+树的数据全部存放在叶子节点,非叶子节点只存放索引,不放数据,所以B+树的高度会更低一点,可以减少磁盘寻道次数。

3.B树的缺点

  • 非叶子节点存放数据
  • B 树的节点分裂和合并需要频繁地调整树的结构,不支持高度动态的场景

4.红黑树的缺点

  • 范围查询性能差
  • 当节点数过多时,高度会急速增加,影响性能

4.如何优化SQL查询?优化索引?对于explain语句里面常见的字段含义是什么?

1.优化sql查询

  • 选择合适的索引
  • 尽量使用limit
  • 使用连表查询而不是子查询
  • 查询的时候,返回需要的字段而不是全部字段

2.优化索引

  • 需要使用多个列作为查询条件时,尽量使用多列索引
  • 把选择性更强的列放在前面
  • 使用覆盖索引
  • 注意索引的失效场景

3.explain语句里常见字段含义

  • select_type : 查询类型,有简单查询、联合查询、子查询等
  • type: 表示访问类型,用于表示查询的访问方式,如ALL(全表扫描)、index(使用索引扫描)、range(范围查询)等。
  • key : 使用的索引
  • rows : 扫描的行数

5.MySQL事务,ACID,隔离级别

1.Mysql事务:

事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。

2.ACID:

  1. 原子性(Atomicity)
    事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。回滚可以用回滚日志(Undo Log)来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。
  2. 一致性(Consistency)
    数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对同一个数据的读取结果都是相同的。
  3. 隔离性(Isolation)
    一个事务所做的修改在最终提交以前,对其它事务是不可见的。
  4. 持久性(Durability)
    一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。

3.隔离级别

  • 未提交读(READ UNCOMMITTED)
    事务中的修改,即使没有提交,对其它事务也是可见的。
  • 提交读(READ COMMITTED)
    一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。
  • 可重复读(REPEATABLE READ)
    保证在同一个事务中多次读取同一数据的结果是一样的。
  • 可串行化(SERIALIZABLE)
    强制事务串行执行,这样多个事务互不干扰,不会出现并发一致性问题。

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

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

相关文章

15.树与二叉树基础

目录 一. 树,基本术语 二. 二叉树 (1)二叉树 (2)满二叉树 (3)完全二叉树 三. 二叉树的性质 四. 二叉树的存储结构 (1)顺序存储结构 (2)链…

CSerialPort教程4.3.x (3) - CSerialPort在MFC中的使用

CSerialPort教程4.3.x (3) - CSerialPort在MFC中的使用 环境: 系统:windows 10 64位 编译器:Visual Studio 2008前言 CSerialPort项目是一个基于C/C的轻量级开源跨平台串口类库,可以轻松实现跨平台多操作系统的串口读写&#x…

C#__自定义类传输数据和前台线程和后台线程

// 前台线程和后台线程 // 默认情况下,用Thread类创建的线程是前台线程。线程池中的线程总是后台线程。 // 用Thread类创建线程的时候,可以设置IsBackground属性,表示一个后台线程。 // 前台线程在主函数运行结束后依旧执行,后台线…

golang的继承

golang中并没有继承以及oop,但是我们可以通过struct嵌套来完成这个操作。 定义struct 以下定义了一个Person结构体,这个结构体有Eat方法以及三个属性 type Person struct {Name stringAge uint16Phone string }func (recv *Person) Eat() {fmt.Prin…

01.Django入门

1.创建项目 1.1基于终端创建Django项目 打开终端进入文件路径(打算将项目放在哪个目录,就进入哪个目录) E:\learning\python\Django 执行命令创建项目 F:\Anaconda3\envs\pythonWeb\Scripts\django-admin.exe(Django-admin.exe所…

微信支付-使用微信JSSDK完成微信支付

前言 使用微信JSSDK完成微信支付 一、安装weixin-js-sdk npm install weixin-js-sdk二、引入 var jweixin require(jweixin-module);三、使用 调用接口 一般调用成功会返回debug,appId,timestamp,nonceStr,signature等参数注…

RK3588平台开发系列讲解(AI 篇)RKNN-Toolkit2 API 介绍

文章目录 一、RKNN 初始化及对象释放二、RKNN 模型配置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解 RKNN-Toolkit2 API 详细说明。 一、RKNN 初始化及对象释放 在使用 RKNN Toolkit2 的所有 API 接口时,都需要先调用 RKNN()方法初始化 RKNN 对象,…

HAProxy 调度算法介绍

HAProxy 调度算法介绍 HAProxy 的调度算法比较多,在没有设置 mode 或者其它选项时,HAProxy 默认对 后端服务器使用 roundrobin 算法来分配请求处理。对后端服务器指明使用的算法 时使用balance关键字,该关键字可在listen和backend中出现。在…

使用Nodejs搭建简单的HTTP服务器 - 内网穿透公网远程访问

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址🍀小结🍀 🎉博客主页:小智_x0___0x_ 🎉欢迎关注:&…

“车-路-网”电动汽车充电负荷时空分布预测(matlab)

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考《基于动态交通信息的电动汽车充电负荷时空分布预测》和《基于动态交通信息的电动汽车充电需求预测模型及其对配网的影响分析》文献模型,考虑私家车、出租车和共用车三类交通工具特性和…

Python支持下最新Noah-MP陆面模式站点、区域模拟及可视化分析技术

查看原文>>> Python支持下最新Noah-MP陆面模式站点、区域模拟及可视化分析技术 熟悉陆表过程的主要研究内容以及陆面模型在生态水文研究中的地位和作用;深入理解Noah-MP 5.0模型的原理,掌握Noah-MP模型(2023年最新发布的5.0版本&am…

Android 查看签名文件的MD5 SHA1值

1.找到存放签名文件所在的文件夹 2.输入命令:keytool -list -v -keystore atui.jks 3.输入口令(keystore.jks签名文件的密码)

牛客网 读取写入数据

牛客网写题与leetcode不同,并没有给输入的数据,而是需要自己从控制台地区并格式化 import sys if __name__ "__main__":# 读取一个数n int(sys.stdin.readline().strip())# 读取一个整型的列表,输入时是以字符串的形式输入的&am…

Linux管理SpringBoot应用shell脚本实现

Liunx系统如何部署和管理SpringBoot项目应用呢?最简单的方法就是写个shell脚本。 Spring Boot是Java的一个流行框架,用于开发企业级应用程序。下面我们将学习如何在Linux服务器上部署Spring Boot应用,并通过一个脚本实现启动、停止、重启等操…

U盘被分成了4个盘要怎么合并

原来是做为系统盘的,然后有一大概小半年没用,今天一看它自己分成了四个盘。 并且我一插入电脑就提示我格式化 其实根本不需要任何工具,操作前最好把U盘数据备份一下 首先把你的U盘插在电脑上 方法一 U盘被分成四个分区的原因有以下几种可…

第二届人工智能与智能信息处理技术国际学术会议(AIIIP 2023)

第二届人工智能与智能信息处理技术国际学术会议(AIIIP 2023) 2023 2nd International Conference on Artificial Intelligence and Intelligent Information Processing 第二届人工智能与智能信息处理技术国际学术会议(AIIIP 2023&#xf…

Seaborn数据可视化(二)

目录 1.Seaborn风格设置 1.1 主题设置 1.2 轴线设置 1.3 移除轴线 1.4 使用字典传递函数 2.设置绘图元素比例 2.1 设置绘图元素比例paper 2.2 设置绘图元素比例poster 2.3 设置绘图元素比例notebook Seaborn将Matplotlib的参数划分为两个独立的组合,第一组用于…

【ARM AMBA AXI 入门 10 - AXI 总线 DATA信号与 STRB 信号之间的关系 】

文章目录 AXI STRB 信号 AXI STRB 信号 AXI总线是ARM公司设计的高性能处理器接口,其中STRB和DATA信号在AXI协议中有特殊的含义和关系。 DATA信号:在AXI中,DATA信号用于在读写操作中传输实际的数据。数据的大小可以根据AXI接口的位宽来变化&…

Ros noetic Move_base 相关状态位置的获取 实战使用教程

前言: 有一段时间没有更新,这篇文章是为了后续MPC路径跟踪算法开设的帖子用于更新我自己的思路,由于MPC算法,要镶嵌到整个导航任务中去,就绕不开这个move_base包中相关的参数设置和其中相关状态位置的获取和解读等等。 因为最近遇到小车在其他的环境中有些时候,不需要自己…

HTTP与RPC的取舍

HTTP与RPC的取舍 HTTP和RPC都是常用的网络通信协议,它们各有优劣。选择何种协议,主要取决于应用的需求和场景。 HTTP和RPC都有各自的优点和缺点,首先我们对两种协议进行一个总结。 HTTP协议图 HTTP的优点: 广泛的支持&#xff1…