9月12扒面经

浏览器输入网址发生了什么?

DNS解析:获取该域名对应的IP地址

浏览器建立TCP连接:三次握手———>发送http请求

服务器处理请求

接收HTTP响应 浏览器渲染页面 关闭TCP连接

tcp的客户端发送报文给服务器,不产生丢包或网络阻塞,但是数据不一致是为什么?

可能存在一下几个原因:

1.数据库同步存在问题;可能存在同步延迟,同步错误。

2.缓存问题:使用缓存来提高性能,但是缓存中数据已经过期,或者被修改。

3.并发访问问题

解决方法:

数据库同步和数据一致性保证

缓存管理:如缓存过期策略,数据库和缓存数据保持一致性。

并发访问控制:使用锁或事务,保证共享资源的正确访问。

索引的类型?

B树、B+树、哈希索引、全文索引、空间索引

内存泄漏的原因?

1.程序中存在循环或者循环产生过多的对象实体,导致内存不断增长

2.对象是可达的

在Java中,对象是可达的意味着虽然该对象不再被程序使用,但是系统中仍然存在引用指向该对象。因为垃圾回收器无法回收仍被引用的对象,所以这些对象会一直占据内存空间。

解决方法:

尽早释放无用对象,或显式的置为null。

模拟实际的工作环境,发现可能发生内存泄漏的问题

3.程序使用了nio直接操作内存,导致内存过大

介绍concurrentHashmap底层结构?

JDK 1.7:中 ConcurrentHashmap采用了数组+Segment + 分段锁的方式实现。

JDK 1.8:中ConcurrentHashmap采用了数组+链表+红黑树的实现来设计,内部采用大量的CAS操作

ConcurrentHashMap的底层结构由多个Segment组成,每个Segment都是一个独立的哈希表。每个Segment都维护了一个数组结构,该数组的每个元素都是一个链表或红黑树。每个Segment都可以独立地加锁,减小锁的粒度,每个线程在访问ConcurrentHashMap时,只需要获取对应Segment的锁,从而提供了更高的并发性能。

CAS是什么?

Compare and Swap是一种基于锁的操作,乐观锁的一种实现方式。它用于在多线程环境下保证数据的一致性和并发性。

CAS操作包含三个操作数:内存地址(或变量)、旧的预期值、新的预期值

执行过程:

读取内存地址中的当前值和旧的值比较,如果当前两个值相等,将新的值写入内存地址,完成操作,如果当前值不等于旧的预期值,则说明其他线程已经修改了该内存地址的值,操作失败。

CAS操作的特点是乐观锁,它并不直接对数据进行锁定,而是通过比较和交换的方式来实现数据的一致性。

如何解决ABA问题?

CAS(Compare and Swap)操作中可能会遇到ABA问题,这是指一个值被另一个线程修改后,又改回原来的值,CAS操作无法判断这个值是否被其他线程修改过。

解决方法:

1.使用带版本号的CAS操作,每次修改数据同时修改版本号,在CAS操作时,同时检查版本号是否一致,都一致再进行交换操作

2.使用带标记的CAS操作,在CAS操作是,还需要比较替换标记。每次进行修改操作时,都会改变标记的值。如果值恢复原来的值,但是标记也会发生变化。

Redis持久化方式?

持久化方式有两种:AOF和RDB

AOF:以独立日志的方式记录,等服务器重启,可以执行AOF日志文件以达到恢复数据的目的。流程:命令写入,文件同步、文件重写、重启加载。

RDB:把当前进程数据生成的快照文件保存到硬盘的过程。RDB文件是一个压缩的二进制文件,通过它可以还原某个时刻数据库的状态。

触发RDB持久化分为手动和自动;

自动触发:

  • 使用save相关配置,如“save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave。
  • 如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点
  • 执行debug reload命令重新加载Redis时,也会自动触发save操作
  • 默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行bgsave。

手动触发分别对应save和bgsave命令:

save:阻塞当前的Redis服务器,知道RDB过程完成。

bgsave:Redis进程执行一个fork操作创建子线程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork进程阶段,一般时间很短。

AOF和RDB的区别?
  1. 数据格式:
    • RDB持久化:将Redis的数据以二进制形式保存到硬盘上的压缩文件。RDB文件是一种快照,包含了Redis在某个时间点上的数据状态。
    • AOF持久化:将Redis的写操作以追加的方式保存到一个日志文件中。AOF文件是一个文本文件,记录了Redis执行的每个写操作。
  2. 文件大小:
    • RDB持久化:RDB文件通常比AOF文件小,因为它是一个压缩过的二进制文件。
    • AOF持久化:AOF文件通常比RDB文件大,因为它是一个文本文件,记录了每个写操作。
  3. 恢复速度:
    • RDB持久化:恢复速度相对较快,因为只需要加载整个RDB文件即可。
    • AOF持久化:恢复速度相对较慢,因为需要逐行执行AOF文件中的写操作。
  4. 数据安全性:
    • RDB持久化:在RDB持久化过程中可能会丢失最后一次快照之后的数据。
    • AOF持久化:AOF持久化可以提供更高的数据安全性,因为可以通过追加操作来记录每次写操作。
  5. 写入性能:
    • RDB持久化:由于RDB是在指定的时间间隔内执行的,因此对于写入性能的影响较小。
    • AOF持久化:由于AOF需要记录每个写操作,因此对于写入性能有一定的影响。
如何与数据库保持数据一致?

强一致性:数据库数据更新,立即更新缓存中的数据。但这会影响性能。

事务:确保操作的原子性

配置数据库的主从复制或者集群复制,可以保证数据在多个实例之间的一致性。

JVM内存区域、堆的分区、新生代老生代如何垃圾回收?

内存区域:程序寄存器,方法区、堆区、本地方法栈、虚拟机栈

堆区被分为:新生代和老年代,新生代被分为Eden空间、Survivor空间(S0、S1)

新生代的垃圾回收:

内存溢出和内存泄漏的区别?

内存溢出是指无法获得所需的内存空间,导致程序无法正常执行;

而内存泄漏是指程序未能正确释放已经不再使用的内存空间,导致内存被长时间占用而无法回收。内存溢出是内存泄漏的一种可能结果,但内存泄漏不一定会导致内存溢出。

场景:给一个用户信息如何存储到数据库

创建数据库表 存储用户信息。

连接数据库

插入数据,将用户信息插入表中,可以使用预编译,参数化查询防止sql注入

关闭连接

Spring AOP、动态代理类型

两种类型的动态代理:

  1. 基于接口的动态代理(JDK动态代理):这种代理方式是基于Java的反射机制实现的。当目标类实现了接口时,Spring AOP会使用JDK动态代理来创建代理对象。代理对象实现了目标接口,并将方s法调用委托给目标对象。JDK动态代理只能代理实现了接口的类。
  2. 基于类的动态代理(CGLIB动态代理):当目标类没有实现接口时,Spring AOP会使用CGLIB动态代理来创建代理对象。CGLIB(Code Generation Library)是一个基于ASM(一个Java字节码操作框架)的代码生成库,它通过生成目标类的子类来实现代理。代理对象继承了目标类,并重写了目标类的方法,将方法调用委托给目标对象。CGLIB动态代理可以代理没有实现接口的类。
mysql的默认隔离级别、解决了什么问题

默认隔离级别,可重复读。解决了脏读、和不可重复读,但幻读仍有可能发生。

如何解决幻读的、mvcC是如何解决幻读的、垂直分表、水平分表

mvcc是一种并发控制机制,用于在数据库系统中处理并发事务的读写冲突。

mvcc在修改数据时,会创建数据的副本,而不是直接修改原始数据。每个事务读取数据时,会根据事务开始的时间戳或版本号来决定可见的数据版本。每个事务看到一致的快照数据,避免了脏读、不可重复读和幻读的问题。

linux常用命令、

vim 查看文件,cd 切换目录 sudo 切换用户 linux设置权限命令、chmod 777

sleep和wait的区别?

sleep和wait都是用于线程控制的方法,但在使用和效果上有一些区别。

  1. sleep方法属于Thread类的静态方法,而wait方法属于Object类的实例方法。因此,sleep方法可以直接通过Thread类调用,而wait方法需要通过对象实例调用。
  2. sleep方法会让当前线程暂停执行指定的时间,然后继续执行。在睡眠期间,线程不会释放锁。wait方法会让当前线程暂停执行,并释放对象的锁,使得其他线程可以访问该对象。
  3. sleep方法不需要被唤醒,一旦时间到达,线程会自动恢复执行。wait方法需要被其他线程调用notify或notifyAll方法来唤醒。
  4. sleep方法使用的是线程的本地资源,不会释放对象的锁。wait方法会释放对象的锁,使得其他线程可以获取该对象的锁。

即:sleep方法适用于线程暂停执行一段时间后继续执行的场景,而wait方法适用于线程等待某个条件满足后再继续执行的场景。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值