常见面试题(随机)

news2024/12/4 3:24:30

常问的几个方面

1.MySQL
存储引擎、事务、锁、索引
2.Redis
数据类型、过期策略、淘汰策略、缓存穿透、缓存击穿、缓存雪崩、分布式锁
3. Spring
Spring Ioc、Spring AOP、Spring MVC


MYSQL

存储引擎

在这里插入图片描述

事务

事务的特性

  • 原子性、一致性、隔离性、持久性事务的隔离性
  • 并发异常:第一类丢失更新、第二类丢失更新、脏读、不可重复读、幻读
  • 隔离级别: Read Uncommitted、Read Committed、Repeatable Read、Serializablespring
    事务管理
  • 声明式事务·编程式事务

范围

  • 表级锁:开销小、加锁快,发生锁冲突的概率高、并发度低,不会出现死锁。
  • 行级锁:开销大、加锁慢,发生锁冲突的概率低、并发度高,会出现死锁。

类型(InnoDB)

  • 共享锁(s)︰行级,读取一行;

  • 排他锁(x)∶行级,更新一行;

  • 意向共享锁(IS)︰表级,准备加共享锁;

  • 意向排他锁(Ix)︰表级,准备加排他锁;

  • 间隙锁(NK)︰行级,使用范围条件时,
    对范围内不存在的记录加锁。一是为了防止幻读,二是为了满足恢复和复制的需要。

在这里插入图片描述
加锁

  • 增加行级锁之前,InnoDB会自动给表加意向锁;
  • 执行DML语句时,InnoDB会自动给数据加排他锁;
  • 执行DQr语句时
    共享锁(s)∶SELECT… FROM… WHERE… LOCK IN SHARE MODE;
    排他锁(x)∶SELECT… FROM… WHERE… FOR UPDATE;
    间隙锁(NK)︰上述sQ采用范围条件时,InnoDB对不存在的记录自动增加间隙锁。

死锁
场景
事务1: UPDATE T SET… WHERE ID = 1; UPDATE T SET… WHERE ID = 2;
事务2:UPDATE T SET… WHERE ID =.2; UPDATE T SET… WHERE ID = 1;·
解决方案
1.一般InnoDB会自动检测到,并使一个事务回滚,另一个事务继续;
2.设置超时等待参数innodb_lock_wait_timeout;
避免死锁
1.不同的业务并发访问多个表时,应约定以相同的顺序来访问这些表;
2.以批量的方式处理数据时,应事先对数据排序,保证线程按固定的顺序来处理数据;
3.在事务中,如果要更新记录,应直接申请足够级别的锁,即排他锁;

悲观锁(数据库)

乐观锁(自定义)
1.版本号机制

UPDATE… SET…,VERSION=# {version+1} WHERE… ANDVERSION=$ {version}

  1. CAS算法(compare and swap)
    是一种无锁的算法,该算法涉及3个操作数(内存值v、旧值A、新值B),当v等于A时,采用原子方式用=的值更新v的值。该算法通常采用自旋操作,也叫自旋锁。

它的缺点是:

  • ABA问题:某线程将A该为B,再改回A,则CAS会误认为A没被修改过。
  • 自旋操作采用循环的方式实现,若加锁时间长,则会给CPU带来巨大的开销。.
  • CAS只能保证一个共享变量的原子操作。

索引

B+Tree (InnoDB)

  • 数据分块存储,每一块称为一页;
  • 所有的值都是按顺序存储的,并且每一个叶子到根的距离相同;
  • 非叶节点存储数据的边界,叶子节点存储指向数据行的指针;
  • 通过边界缩小数据的范围,从而避免全表扫描,加快了查找的速度。
    在这里插入图片描述

Redis

在这里插入图片描述

过期策略

Redis会把设置了过期时间的key放入一个独立的字典里,在key过期时并不会立刻删除它。
Redis会通过如下两种策略,来删除过期的key:

  • 惰性删除
    客户端访问某个key时, Redis会检查该key是否过期,若过期则删除。
  • 定期扫描
    Redis默认每秒执行10次过期扫描(配置hz选项),扫描策略如下:
    1.从过期字典中随机选择20个key;
    2.删除这20个key中已过期的key;
    3.如果过期的key的比例超过25%,则重复步骤1;

淘汰策略

当Redis占用内存超出最大限制(maxmemory)时,可采用如下策略(maxmemory-policy),让Redis淘汰一些数据,以腾出空间继续提供读写服务:

  • noeviction:对可能导致增大内存的命令返回错误(大多数写命令,DEL除外);

  • volatile-ttl:在设置了过期时间的key中,选择剩余寿命(TTL)最短的key,将其淘汰;.

  • volatile-lru:在设置了过期时间的key中,选择最少使用的key (LRU),将其淘汰;

  • volatile-random:在设置了过期时间的key中,随机选择一些key,将其淘汰;

  • allkeys-lru:在所有的key中,选择最少使用的key (LRU),将其淘汰;.

  • allkeys-random:在所有的key中,随机选择一些key,将其淘汰。

  • LRU算法
    维护一个链表,用于顺序存储被访问过的key。在访问数据时,最新访问过的key将被移动到表头,即最近访问的key在表头,最少访问的key在表尾。

  • 近似LRU算法(Redis)
    给每个ke y维护一个时间戳,淘汰时随机采样5个key,从中淘汰掉最旧的key。如果还是超出内存限制,则继续随机采样淘汰。
    优点:比LRu算法节约内存,却可以取得非常近似的效果。

缓存穿透

场景
查询根本不存在的数据,使得请求直达存储层,导致其负载过大,甚至宕机。
解决方案
1.缓存空对象
存储层未命中后,仍然将空值存入缓存层。再次访问该数据时,缓存层会直接返回空值
2.布隆过滤器
所有存在的key提前存入布隆过滤器,在访问缓存层之前,先通过过滤器拦截,若请求的是不存在的key,则直接返回空值。
在这里插入图片描述

缓存击穿

场景
一份热点数据,它的访问量非常大。在其缓存失效瞬间,大量请求直达存储层,导致服务崩溃

解决方案
1.加互斥锁
对数据的访问加互斥锁,当一个线程访问该数据时,其他线程只能等待。
这个线程访问过后,缓存中的数据将被重建,届时其他线程就可以直接从缓存取值。
2.永不过期
**不设置过期时间,**所以不会出现上述问题,这是“物理”上的不过期。
为每个value设置逻辑过期时间,当发现该值逻辑过期时,使用单独的线程重建缓存。

缓存雪崩

场景
由于某些原因,缓存层不能提供服务,导致所有的请求直达存储层,造成存储层宕机。(大量的数据请求)
解决方案
1.避免同时过期
设置过期时间时,附加一个随机数,避免大量的key同时过期。
2.构建高可用的Redis缓存
部署多个Redis实例,个别节点宕机,依然可以保持服务的整体可用。
3.构建多级缓存
增加本地缓存,在存储层前面多加一级屏障,降低请求直达存储层的几率。
4.启用限流和降级措施
对存储层增加限流措施,当请求超出限制时,对其提供降级服务。

分布式锁

场景

修改时,经常需要先将数据读取到内存,在内存中修改后再存回去。在分布式应用中,可能多个进程同时执行上述操作,而读取和修改非原子操作,所以会产生冲突。增加分布式锁,可以解决此类问题。

基本原理

  • 同步锁:在多个线程都能访问到的地方,做一个标记,标识该数据的访问权限。
  • 分布式锁:在多个进程都能访问到的地方,做一个标记,标识该数据的访问权限。

实现方式
1.基于数据库实现分布式锁;
2.基于Redis实现分布式锁;
3.基于zookeeper实现分布式锁;

Redis实现分布式锁的原则
1.安全属性独享。在任一时刻,只有一个客户端持有锁。
2.活性A:无死锁。即便持有锁的客户端崩溃或者网络被分裂,锁仍然可以被获取。
3.活性B:**容错。**只要大部分Redis节点都活着,客户端就可以获取和释放锁。

单Redis实例实现分布式锁

1.获职锁使用命令:

SET resource_name my _random_value NX PX 30000
resource_name:key
my _random_value:随机值

NX︰仅在key不存在时才执行成功。
PX:设置锁的自动过期时间。

2.通过Lua脚本释放锁:

if redis.call ( "get",KEYS [1]) == ARGV [ 1] then
return redis.call ( "del",KEYS [1])
else return 0 end

可以避免删除别的客户端获取成功的锁:(A加锁->A阻塞->因超时释放锁->B加锁->A恢复->释放锁)

多Redis实例实现分布式锁

Redlock算法,该算法有现成的实现,其Java版本的库为Redisson

步骤:
1.获取当前Unix时间,以毫秒为单位。(1970年开始)

2.依次尝试从x个实例,使用相同的key和随机值获取锁,并设置响应超时时间。如果服务器没有在规定时间内响应,客户端应该尽快尝试另外一个Redis实例

3.客户端使用当前时间减去开始获取锁的时间,得到获取锁使用的时间。当且仅当大多数的Redis节点都取到锁,并且使用的时间小于锁失效时间时,锁才算取得成功。

4.如果取到了锁,key的真正有效时间等于有效时间减去获取锁使用的时间。

5.如果获取锁失败,客户端应该在所有的Redis实例进行解锁

Spring

Spring IOC

Bean的作用域
在这里插入图片描述

AOP

在这里插入图片描述

Spring MVC

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Stm32标准库函数2——多通道ADC DMA

#include "stm32f10x.h" //在该头文件中默认定义系统时钟为72M #include "delay.h" #include "sys.h" #include "usart.h" #include "adc.h" #include "DMA.h" //串口:A9 A10,波特率11…

linux-12月第四周-磁盘存储和文件系统

文章目录管理存储使用磁盘空间过程为什么要磁盘分区划分分区的方式MBR管理存储 使用磁盘空间过程 买来一块新硬盘后,有以下三个使用步骤 第一步:划分分区(将硬盘划分为若干个分区,windows上的C盘,D盘,E盘…

SCUT01在线协作白板技术解决方案

在七牛云校园黑客马拉松中,来自华南理工大学的SCUT01团队,为我们带来了UI精美、体验优秀的白板作品,在大赛中获得二等奖的好成绩。以下是这款在线协作白板的技术解决方案。 背景 疫情背景下,线上课堂、线上会议等业务背景下都有着…

PCL 点云配准衡量指标

0. 简介 PCL作为目前最为强大的点云库,内部存在有大量集成好的算法。而对于数据量大、非同源、含大量噪声且部分重叠的激光点云与影像重建点云,其稀疏程度、噪声程度等不同,非重叠区域的面积很大。真实场景的点云尤其是影像重建点云噪声较多…

用javascript分类刷leetcode23.并查集(图文视频讲解)

并查集(union & find):用于处理一些元素的合并和查询问题 Find:确定元素属于哪一个子集,他可以被用来确定两个元素是否属于同一个子集,加入路径压缩,复杂度近乎O(1) Union:将两…

如何在 ESXi 7.x 上安装 Windows Server 2019

安装 Windows Server 2019 连接 ESXi 7.0上传 Windows Server 2019 镜像创建虚拟机安装 Windows Server 2019在本文中,我们将逐步在 ESXi 7.x 上安装 Windows Server 2019。 连接 ESXi 7.0 使用 VMware 主机或 vSphere Web 客户端连接到 VMware vSphere Hypervisor 7.0(ESX…

Unity-ROS与话题与服务(二)

0. 简介 对于ROS而言,其最常用的就是Topic话题以及Service两个了。之前我们在了解Unity Robotics Hub时候就了解到基本的Unity和ROS的通讯,下面我们来详细介绍一下Unity与ROS的话题与服务。 ROS和Unity之间的通信是通过Unity的“ROS-TCP-Connector”软…

Linux学习07-vim程序编辑器

1 vi与vim vi 是老式的文书处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具,就连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个“程序开发工具”而…

服务器内存CPU负载监控

1,系统平均负载(Load average): 系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树,一般来说只要每个CPU的当前活动进程数不大于3那么系统的性能就是良好的,如果每个CPU的任务数大于5,那么就表示这台机器的…

SpringBoot+MDC实现链路调用日志

1.首先介绍什么是MDC MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 、logback及log4j2 提供的一种方便在多线程条件下记录日志的功能。MDC 可以看成是一个与当前线程绑定的哈希表,可以往其中添加键值对。MDC 中包含的…

毕业设计 STM32自行车智能无线防盗报警器 -物联网 单片机 嵌入式

0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过…

【C++进阶】C++11新特性下篇(万字详解)

🎇C学习历程:入门 博客主页:一起去看日落吗持续分享博主的C学习历程博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记&…

京东前端高频vue面试题(边面边更)

Redux 和 Vuex 有什么区别,它们的共同思想 (1)Redux 和 Vuex区别 Vuex改进了Redux中的Action和Reducer函数,以mutations变化函数取代Reducer,无需switch,只需在对应的mutation函数里改变state值即可Vuex由…

【树莓派】擦灰重启行动

高中时候看大佬各种秀项目,于是乎兴致冲冲买了一块树莓派4B,400r,当时没想到光是开机,就折腾了两个星期~后来不出意外它在房间的角落很安逸地吃灰,但是,后来,我误打误撞学了CS,再误打…

Okhttp源码分析实践(五)【实践环节:Okhttp的基本框架搭建请求实现】

http的基础知识、okhttp的框架基本源码,我们通过之前课程都已学习总结过,接下来,就是关键的实践课程。 各位coder,需要紧跟小编脚步,要开始加速飙车了。 1.基本框架的搭建实现 既然不知道如何入手,我们不妨就以okhttp的基本使用代码为例,作为入手点,去开始编程实现。…

机器学习理论介绍

前言 图灵奖获得者、著名数据库专家James Gray 博士观察并总结人类自古以来,在科学研究上,先后历经了实验、理论、计算和数据四种范式。 科学研究第一种范式:实验 在古代,人们的认知水平较低,对事物的认识很大程度上…

React redux使用

1.redux是什么 redux是一个专门用于状态管理的JS库(不是react插件库) 它可以用在react,angular,vue等项目中,但基本与react配合使用 作用:集中式管理react应用中多个组件共享的状态 2.为什么要使用redux 某个组件的状态&#…

Windows命令行到底有多强大?

程序员宝藏库:https://gitee.com/sharetech_lee/CS-Books-Store DevWeekly收集整理每周优质开发者内容,包括开源项目、资源工具、技术文章等方面。 每周五定期发布,同步更新到 知乎:Jackpop。 欢迎大家投稿,提交issu…

高可用系列文章之三 - NGINX 高可用实施方案

前文链接 高可用系列文章之一 - 概述 - 东风微鸣技术博客 (ewhisper.cn)高可用系列文章之二 - 传统分层架构技术方案 - 东风微鸣技术博客 (ewhisper.cn) 四 NGINX 高可用实施方案 高可用的实施, 主要步骤概述如下: NGINX 的安装及基础配置负载均衡层高可用: NGINX Keepali…