面试笔记8.6

news2025/1/11 5:37:20

缓存

1.如何保证redis与数据库一致性

redis面试:如何保证缓存和数据库数据的一致性?_使用update更新数据,json缓存不更新-CSDN博客

如果先删除缓存,再删除数据库,数据不一致,

解决

1.先操作缓存但不删除缓存,

2.双删法则

先给缓存设置过期时间,

引入mq保证原子性操作

2.redis如何配置key的过期时间,时间原理是什么

Redis中如何配置key的过期时间?他的是实现原理是什么?_idea配置redis ke过期时间-CSDN博客

1. EXPIRE      

设置key之后,然后设置过期时间,设置key的同时设置过期时间

2. SETEX 

设置同时设置过期时间

原理:

1.定时删除

2. 延迟删除  获取get ,set 时判断是否过期,过期删除

时间单位默认s

Redis使用两种方式结合的形式

  1. 定期删除要注意执行频率和执行时长
    定期删除会遍历每个database(默认16个,从0开始),检查当前库中的随机20个(默认),随机抽查key,如果有过期,则删除;
    程序中有个全局变量会记录扫描到了哪个库;

3. 海量数据下如何快速查找一条记录

1.使用布隆过滤器快速过滤不存在的数据

2.redis中使用bitmap实现布隆过滤器

3.在redis中建立数据缓存

4.查询优化 安槽位分配数据

微服务

1.谈谈你对微服的理解,它的优点和缺点

微服务架构的概念、特点、优缺点以及最佳实践-阿里云开发者社区 (aliyun.com)

微服务是一种架构风格,大型单体应用变成较小的单位,降低了整个系统的复杂度

优点

1.微服务更加灵活,耦合性低,每个应用都是独立的

2.技术更新灵活,不依赖具体语言,灵活选择技术栈

3.应用的性能能够得到提升

4.更易组合专门的团队

5.代码复用性更高

缺点

1.服务调用复杂度提升,网络,容错问题

2.分布式事物尽量不适用微服务事物

3.测试难度提升

4.运维难度提升 

2.springclude 和阿里巴巴的组件

SpringCloud NetFlix

eureka 注册中心

hytirx 服务容错

feign 远程调用

ribbon 负载均衡

zuul 用于网管

config 配置中心,结合get仓库

get 配置中心

SpringCloudAlibaba 

nacos 注册中心 ,配置中心(优点,支持热更新)

sentinal 服务容错

dubbo 服务之间的调动 远程调用

RocketMQ用于消息处理

seata 分布式事物管理

springclode getway 适用于网管

2.怎么实现拆分实现高类聚,低耦合

1.微服务之间尽量不要有业务交叉,降低耦合度,

2.微服务之间只能通过接口调用数据,不要绕过接口访问数据

3.微服务之间主要通过同步接口调动,异步事件驱动方式实现高类聚,低耦合

ddd领域模型驱动

中台 

阿里退出去除中台,提出小前台,大中台,抽取各个可以复用的功能抽离出来,形成可复用的主键

业务中台,数据中台,技术中台,结合ddd实现领域相关东西

3.什么是spring 谈谈对ioc和aop的理解

sping是企业级框架,简化软件开发,配置过程,简化项目部署环境

优点:

1.低嵌入设计对业务代码污染很低

2.spring  di机制(依赖注入)将对象的管理机制交给框架处理,降低了耦合度

3.aop支持将通用功能集中式管理,提供更好的复用性

4.spring类主流框架提供非常好的支持

ioc 控制反转

创建对象的控制权交给spring管理

ioc-3种注入方式

1.selter注入

2.根据注解注入

3.构造器注入

aop 面向切面编程

用于将与业务无关,但却对多个对象产生影响的多个行为,抽取并封装成可重用的模块。

核心--动态代理

jdk 动态代理  被代理对象一定要使用接口  jkd模式使用

cglib 动态代理 被代理对象不一定使用接口 

补充:Spring AOP使用篇:熟悉使用前置通知、后置通知、返回通知、异常通知,并了解其相关特性_你在项目里写过前置通知后置通知,在什么业务场景下-CSDN博客

4.Spring容器启动的流程

使用AnnotationConfigApplicationContext 来跟踪一下启动流程:

 this();  初始化reader和scanner

scan(basePackages); 使用scanner组件扫描basePackage下的所有对象,将配置类的BeanDefinition注册到容器中。

refresh();  刷新容器。

​    prepareRefresh 刷新前的预处理

​    obtainFreshBeanFactory: 获取在容器初始化时创建的BeanFactory

​    prepareBeanFactory: BeanFactory的预处理工作,会向容器中添加一些组件。

​    postProcessBeanFactory: 子类重写该方法,可以实现在BeanFactory创建并预处理完成后做进一步的设置。

​    invokeBeanFactoryPostProcessors: 在BeanFactory初始化之后执行BeanFactory的后处理器。

​    registerBeanPostProcessors: 向容器中注册Bean的后处理器,他的主要作用就是干预Spring初始化Bean的流程,完成代理、自动注入、循环依赖等这些功能。

​    initMessageSource: 初始化messagesource组件,主要用于国际化。

​    initApplicationEventMulticaster: 初始化事件分发器

​    onRefresh: 留给子容器,子类重写的方法,在容器刷新的时候可以自定义一些逻辑。

​    registerListeners: 注册监听器。

​    finishBeanFactoryInitialization: 完成BeanFactory的初始化,主要作用是初始化所有剩下的单例Bean。

​    finishRefresh: 完成整个容器的初始化,发布BeanFactory容器刷新完成的事件。

5.spring容器中,bean的启动流程

1.实例化 当客户端向容器申请bean 容器会初始化bean 并保存到BeanDefinition

2.设置对象属性赋值,spring通过BeanDefinition找到对象的依赖,并将这些对象进行赋值

3.初始化 调用一下几个接口实现 BeanNameAware、BeanClassLoaderAware、BeanFactoryAware、ApplicationContextAware

4.前置处理器BeanPostProcessor 会调用方法,实现前置处理器的初始化

5.InitializingBean初始化 spring 执行set方法 定制初始化逻辑

6.配置init-method定义自定义的初始化逻辑

7.会执行后置处理器BeanPostProcessor,调用调用BeanPostProcessor的postProcessAfterInitialization方法,进行后置处理器

8.销毁 它会自动调用DisposableBean进行销毁 

当Bean实现了这个接口,在对象销毁前就会调用destory()方法

9.如果说我们配置destroy-method或者@PreDestroy注解会根据自己定义的销毁逻辑,进行销毁

6.spring中bean是安全的吗?怎么处理?

spring容器中bean没有提供安全的策略,不是性能安全的,因此在spring中,bean不是线程安全的。

sington 单列对象,不管创建多少对象都会返回一个,单列设计模式

prototype   生命周期,作用域  每创建一个对象都会创建一个新的

request 为每个请求产生对象

setion 为每个回话产生对象

global-session    为这个项目创建对象

解决问题:

多个线程修改共享数据会产生线程问题

大部分的bean是无状态的,没有保存值,不存在线程安全的问题。

bean有状态,保存数据 ThreadLocal解决线程安全问题

7.spring中处理循环依赖的问题

spring 循环依赖以及解决方案(吊打面试官)_循环依赖解决方案-CSDN博客

 通过构造循环依赖解决,三级缓存

第一级缓存对象最终的单列式缓存

private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

第二级 缓存初始化对象

private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);

第三级 对象的ObjectFactory对象

private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);

对于对象的普通引用,二级缓存会保存不完整的对象,当单列池中找不到依赖属性时,可以从二级缓存中获取到不完整对象,完成对象的创建,在后续的依赖注入过程中,在单列池的引用关系调整为完整的。

如果引用对象配置了aop,那么在单列池中,需要注入动态代理对象,而不是原对象,而生产动态代理需要完成对象初始化之后开始,因此spring增加里三级缓存保证动态代理对象。

8.sping中如何处理我们的事物

什么是事务?spring如何处理事务?_什么是事务?如何使用?如何事务回滚?-CSDN博客

支持两种事物

编程式事物 使用TransactionTemplate实现

声明式事物aop aop的基础上实现了事物实现机制 最大的优点就是不需要添加事物,需要相应的事物规则声明

区别在于

声明式事物只能针对方法级别

事物传播行为

Spring中对事务定义了不同的传播级别: Propagation

1、 PROPAGATION_REQUIRED:默认传播行为。 如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入到事务中。

2、PROPAGATION_SUPPORTS: 如果当前存在事务,就加入到该事务。如果当前不存在事务,就以非事务方式运行。

3、PROPAGATION_MANDATORY: 如果当前存在事务,就加入该事务。如果当前不存在事务,就抛出异常。

4、PROPAGATION_REQUIRES_NEW: 无论当前存不存在事务,都创建新事务进行执行。

5、PROPAGATION_NOT_SUPPORTED: 以非事务方式运行。如果当前存在事务,就将当前事务挂起。

6、PROPAGATION_NEVER : 以非事务方式运行。如果当前存在事务,就抛出异常。

7、PROPAGATION_NESTED: 如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则按REQUEIRED属性执行。

Spring中事务的隔离级别:

1、ISOLATION_DEFAULT: 使用数据库默认的事务隔离级别。

2、ISOLATION_READ_UNCOMMITTED: 读未提交。允许事务在执行过程中,读取其他事务未提交的数据。

3、ISOLATION_READ_COMMITTED: 读已提交。允许事务在执行过程中,读取其他事务已经提交的数据。

4、ISOLATION_REPEATABLE_READ: 可重复读。 在同一个事务内,任意时刻的查询结果是一致的。

5、ISOLATION_SERIALIZABLE: 所有事务依次执行。

9.spring 中控制器是不是单列模式,如果是怎么保证线程安全?

控制器是单列模式,是不安全的。

将控制器设置为无状态模式,里面没有数据,而是引用aop,servers。

mysql 

1.mysql中有哪几种存储引擎

show ENGINES查看引擎

MYSQL有哪些存储引擎,各自优缺点。_mysql有哪些存储引擎,各自优缺点-CSDN博客

MyISAM

mylsam每个表有两个文件,分别是MYD(存储数据文件)和MYISAM (存储索引文件)

InnoDB

idb索引和数据存储在一起的

2.mylsqm不支持事物,innodb支持事物,支持行级别的

3.mylsqm不支持xa事物,innodb支持xa事物

4.mylsqm不支持savePoints ,innodb支持savePoints

2.什么是脏读,幻读,不可重复读,怎么处理?

脏读 一个事务读取了另一个事务尚未提交的数据

处理

加锁 

事物隔离 

mvcc

幻读 一个事务在多次查询时,得到了不同数量的符合条件的记录,这是由于其他事务插入、删除了符合条件的记录导致的。

不可重复读 多次查询结果不一致

3.事物基本特征和四大隔离级别

事物的四大特性、四大隔离级别_事物特性-CSDN博客

① Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成 功,要么全部失败。

② Consistency(一致性):事务完成时,数据必须处于一致状态,数据的完整性约束没有被破坏,事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没    有执行过一样。

③ Isolation(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性 和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。

 4.Durability(持久性):事务结束后,事务处理的结果必须能够得到固化。

4 事务的隔离级别
4.1 Read uncommitted (读未提交)
  如果一个事务A已经开始写数据,则另一个事务B不允许写操作。但是可以读取这个事务A修改但未提交的数据。最低级别,任何情况都无法保证。

4.2 Read Committed (读已提交)
  事务A只能读取事务B修改并且提交后的数据行,禁止访问事务B处于写状态的数据行。可以避免脏读。

4.3 Repeatable Read(可重复读取)
  事务A在读取数据行时,禁止其他事务对该数据行进行更改,但是可以进行读取操作。进行写操作时,禁止其他事务的任何操作。可以防止脏读和不可重复读。

4.4 Serializable (可串行化)
  提供严格的隔离级别,要求事务一个个的执行。不能并发执行。有效的防止脏读,不可重复读,幻读。

5 mysql与oracle的区别
mysql支持4中隔离级别,且自动提交,其中默认的隔离级别是repeatable read。
在mysql中查看当前的隔离级别,select @@tx_isolation;
在mysql中设置数据库的隔离级别,set tx_isolation=‘隔离级别名称’,一定要在开启事务之前,设置隔离级别。如果通过jdbc设置事务的隔离级别,也要在开启事务代码前,写上隔离级别代码。
oracle支持两种隔离级别(read committed,serializable),需要手动提交,默认的隔离级别是read committed。


4.数据库的锁

MySQL数据库的锁 --- 六种分类 - 14种锁详细介绍_mysql的锁-CSDN博客

行锁 力度小 加锁资源开销大 innerdb支持

 共享锁 读锁 他是多个事物可以对同一个数据共享同一把所 只能读数据

 排他锁  写锁 只有一个事物可以获取排他锁 增删改

 自增锁  对mysql自增字段的锁 自增锁可以重置crucate table不能回滚

 表锁 力度大 开销小 innerdb和myisam都支持

异向锁 不需要用户干预,自己维护自己

全局锁  读写分离 提高性能

全局锁

5.mysql索引结构是怎样的

MySQL的索引——索引的介绍及其数据结构B+树 & 索引的类型 & 索引的使用及其失效场景 & 相关名词解释_mysql的索引结构-CSDN博客

b+树

非叶子不存储数据,只进行数据索引

所有数据都存储在叶子节点中,

每个叶子节点都存有相邻的叶子节点指针

叶子节点按照本身关键字从小到大进行排序


6.聚簇索引和非聚簇索引

数据和索引在一起的索引是聚簇索引

myisam是非聚簇索引  数的叶子节点上的data是引用地址

innerdb 数的叶子节点上的是数据本身

一个表中一个聚簇索引,非聚簇索引有很多个

聚簇索引的物理存储数据和索引的地址是一样的

7.mysql集群怎么搭建

MySQL集群最全详解(图文全面总结)-CSDN博客

master主 slave从

从同步主  不能主同步从 

读用从来做 ,读用主来做

8.谈谈mysql分表,多大数据需要分库分表

当表中数据量过大时,整个查询效率降低得非常明显,进行分表,

mycat2

ShardingSphere 实现分表 

分片

垂直分片 

根据业务角度,能够解决数据库过大的问题

水平分片

数据角度拆分

数据文件超过2g 或者数据量超过500w

          

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

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

相关文章

lambda语法,java8Stream流,maven

lambda语法 Arraylist排序 ArrayList<Integer> a new ArrayList();a.add(1);a.add(2);a.add(3);a.sort(new Comparator<Integer>() {Overridepublic int compare(Integer o1, Integer o2) {return o1-o2;//对集合a中数据进行升序排序}}); 但是这样的书写还是有…

JavaEE: 进程和线程

文章目录 进程线程的概念和区别总结如何创建线程1.继承Thread重写run2.实现Runnable重写run3.继承Thread重写run,通过匿名内部类来实现4. 实现Runnable重写run,通过匿名内部类来实现5.基于lambda表达式来创建 虚拟线程 并发编程: 通过写特殊的代码&#xff0c;把多个CPU核心都利…

Leetcode力扣刷题——182.查找重复的电子邮箱

题目 编写解决方案来报告所有重复的电子邮件。 请注意&#xff0c;可以保证电子邮件字段不为 NULL。 以 任意顺序 返回结果表。 结果格式如下例。 结果 # Write your MySQL query statement below select Email from Person group by email having count(*)>1; 知识点 c…

Java 抽象知识笔记总结(油管)

Java系列文章目录 Java Optional 容器笔记总结 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;三、问题描述四、解决方案&#xff1a;4.1 抽象类的使用4.2 抽象类与接口的区别4.2.1 接口复习4.2.2 具体区别4.2.3 使用场景4.2.3.1 抽象类使用场景4.2.3.2 接口使用…

读零信任网络:在不可信网络中构建安全系统11用户组的认证和授权

1. 用户组的认证和授权 1.1. 几乎在每个系统中都有一小部分操作需要被密切关注 1.1.1. 每个应用对这部分操作的风险容忍度各有不同&#xff0c;且没有任何下限 1.1.2. 一部分风险是由用户个人的可信度决定的 1.1.2.1. 单个用户的可信度可能很低 1.1.2.2. 多个用户组合的可信…

OpenAI人事变动:联合创始人John Schulman离职加入Anthropic

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【JVM基础14】——垃圾回收-强引用、软引用、弱引用、虚引用的区别

目录 1- 引言&#xff1a;为什么分多种引用类型2- ⭐核心&#xff1a;2-1 强引用2-2 软引用2-3 弱引用2-4 虚引用 3- 小结&#xff1a;3-1 强引用、软引用、弱引用、虚引用的区别&#xff1f; 1- 引言&#xff1a;为什么分多种引用类型 在 Java 中&#xff0c;引用类型被分为强…

ICM-20948芯片详解(8)

接前一篇文章&#xff1a;ICM-20948芯片详解&#xff08;7&#xff09; 六、寄存器详解 1. 总述 ICM-20948共有user bank 0~3共4组寄存器。 USER BANK 0寄存器图 USER BANK 0所包含的寄存器如下图所示&#xff1a; USER BANK 1寄存器图 USER BANK 1所包含的寄存器如下图所…

校园外卖微信小程序的设计与实现

校园外卖微信小程序的设计与实现 校园外卖微信小程序的设计与实现 [摘要] 随着社会的进步和生活质量的提高&#xff0c;人们对用餐体验有了更高的要求&#xff0c;导致电话和网上订餐服务日益发展。这一趋势也推动了以大学生为主要服务对象的校园外卖的发展。此次设计主要为大…

AI大模型巡游记第二回探索幻梦

unsetunset第二回&#xff1a;探索幻梦unsetunset **随着夕阳西下&#xff0c;李逸结束了今天的探险之旅…… 李逸回到了现实世界&#xff0c;心中满是对“幻境大模型”体验的好奇与惊叹。他迫不及待地想要了解更多关于这项技术背后的秘密。于是&#xff0c;他决定访问“幻梦”…

Python写UI自动化--playwright(元素焦点的控制)

在UI测试中会遇到一种情况&#xff0c;在输入框输入内容&#xff0c;鼠标焦点离开输入框后&#xff0c;前端会对输入框内容进行判断是否合法&#xff0c;比如输入不正确格式的账号&#xff0c;会有相应的提示。该篇文章就讲一讲playwright关于元素焦点的控制&#xff1a; Play…

Makefile基础语法 看这一篇就够了

Makefile 基础语法 Makefile 是一种用于自动化构建过程的脚本文件&#xff0c;它通过定义目标文件和依赖关系来告诉 make 工具如何构建项目。Makefile 的语法和结构可以非常灵活&#xff0c;适用于各种复杂的构建场景。本教程将详细介绍 Makefile 的基本概念、语法以及如何编写…

python3 pyside6图形库学习笔记及实践(五)

目录 前言选项卡(QTabWidget)创建选项卡常用属性和方法常用信号 堆叠页面(QStackedWidget)创建堆叠容器切换页面过渡动画 前言 本系列文章为b站PySide6教程以及官方文档的学习笔记 原视频传送门&#xff1a;【已完结】PySide6百炼成真&#xff0c;带你系统性入门Qt 官方文档…

Linux云计算 |【第二阶段】CLUSTER-DAY3

主要内容&#xff1a; Ceph概述、部署Ceph集群、Ceph块存储 一、分布式存储基础 分布式系统&#xff08;Distributed File System&#xff09;是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。文件系统管理的物理存储资源不一定直接连接在本…

ClickHouse:单机安装

目录 一、ClickHouse介绍 二、安装ClickHouse 2.1安装要求 2.2单机安装 2.3修改配置文件(可选) 2.4升级软件 三、使用ClickHouse 3.1连接ClickHouse 3.2 执行SQL 一、ClickHouse介绍 ClickHouse是由Yandex开源的一个高性能、面向列的SQL数据库管理系统&#xff08;DBM…

【踩坑】pytorch中的索引与copy_结合不会复制数据及其解决方案

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 背景知识 实验验证 结论分析 错误案例 处理方法 注意事项 附加说明 基本索引返回视图 高级索引返回副本 赋值操作都是原地操作 以下内容…

SS9283403 sqlite3交叉编译并部署到SS928(六)

1.Sqlite3下载 连接&#xff1a;SQLite Download Page 2.解压 tar zxvf sqlite-autoconf-3460000.tar.gz 3.配置并编译 进入解压目录&#xff0c;打开命令行&#xff0c;输入如下命令 ./configure CCaarch64-mix210-linux-gcc --hostarm-linux --prefix/home/mc/work/sqlite…

002发那科ROBOGUIDE仿真导入模型

打开已经创建好的工程&#xff0c;找到“机器” 右键&#xff0c;添加机器->CAD文件(F) 找到本地的3D模型&#xff0c;然后点击&#xff0c;打开 设置模型位置[0,0,0,0,0,0] 然后就导入进来啦

对比速览 | Alluxio 企业版 v.s. 社区版

当前诸多企业面临着日益增长的数据量和复杂的数据管理挑战。特别是在模型训练的过程中&#xff0c;诸如GPU短缺、GPU利用率不高等问题已经成为许多企业在技术实施中面临的挑战。同时&#xff0c;大数据分析中跨云数据访问速度慢、成本高等问题也给企业带来了痛点。为了应对这些…

redolog和binlog的两阶段提交和区别

redolog和binlog区别 redo log 是 InnoDB 引擎特有的&#xff1b;binlog 是 MySQL 的 Server 层实现的&#xff0c;所有引擎都可以使用。redo log 是物理日志&#xff0c;记录的是“在某个数据页上做了什么修改”&#xff1b;binlog 是逻辑日志&#xff0c;记录的是这个语句的…