文章目录
浏览器输入网址发生了什么?
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的区别?
- 数据格式:
- RDB持久化:将Redis的数据以二进制形式保存到硬盘上的压缩文件。RDB文件是一种快照,包含了Redis在某个时间点上的数据状态。
- AOF持久化:将Redis的写操作以追加的方式保存到一个日志文件中。AOF文件是一个文本文件,记录了Redis执行的每个写操作。
- 文件大小:
- RDB持久化:RDB文件通常比AOF文件小,因为它是一个压缩过的二进制文件。
- AOF持久化:AOF文件通常比RDB文件大,因为它是一个文本文件,记录了每个写操作。
- 恢复速度:
- RDB持久化:恢复速度相对较快,因为只需要加载整个RDB文件即可。
- AOF持久化:恢复速度相对较慢,因为需要逐行执行AOF文件中的写操作。
- 数据安全性:
- RDB持久化:在RDB持久化过程中可能会丢失最后一次快照之后的数据。
- AOF持久化:AOF持久化可以提供更高的数据安全性,因为可以通过追加操作来记录每次写操作。
- 写入性能:
- RDB持久化:由于RDB是在指定的时间间隔内执行的,因此对于写入性能的影响较小。
- AOF持久化:由于AOF需要记录每个写操作,因此对于写入性能有一定的影响。
如何与数据库保持数据一致?
强一致性:数据库数据更新,立即更新缓存中的数据。但这会影响性能。
事务:确保操作的原子性
配置数据库的主从复制或者集群复制,可以保证数据在多个实例之间的一致性。
JVM内存区域、堆的分区、新生代老生代如何垃圾回收?
内存区域:程序寄存器,方法区、堆区、本地方法栈、虚拟机栈
堆区被分为:新生代和老年代,新生代被分为Eden空间、Survivor空间(S0、S1)
新生代的垃圾回收:
内存溢出和内存泄漏的区别?
内存溢出是指无法获得所需的内存空间,导致程序无法正常执行;
而内存泄漏是指程序未能正确释放已经不再使用的内存空间,导致内存被长时间占用而无法回收。内存溢出是内存泄漏的一种可能结果,但内存泄漏不一定会导致内存溢出。
场景:给一个用户信息如何存储到数据库
创建数据库表 存储用户信息。
连接数据库
插入数据,将用户信息插入表中,可以使用预编译,参数化查询防止sql注入
关闭连接
Spring AOP、动态代理类型
两种类型的动态代理:
- 基于接口的动态代理(JDK动态代理):这种代理方式是基于Java的反射机制实现的。当目标类实现了接口时,Spring AOP会使用JDK动态代理来创建代理对象。代理对象实现了目标接口,并将方s法调用委托给目标对象。JDK动态代理只能代理实现了接口的类。
- 基于类的动态代理(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都是用于线程控制的方法,但在使用和效果上有一些区别。
- sleep方法属于Thread类的静态方法,而wait方法属于Object类的实例方法。因此,sleep方法可以直接通过Thread类调用,而wait方法需要通过对象实例调用。
- sleep方法会让当前线程暂停执行指定的时间,然后继续执行。在睡眠期间,线程不会释放锁。wait方法会让当前线程暂停执行,并释放对象的锁,使得其他线程可以访问该对象。
- sleep方法不需要被唤醒,一旦时间到达,线程会自动恢复执行。wait方法需要被其他线程调用notify或notifyAll方法来唤醒。
- sleep方法使用的是线程的本地资源,不会释放对象的锁。wait方法会释放对象的锁,使得其他线程可以获取该对象的锁。
即:sleep方法适用于线程暂停执行一段时间后继续执行的场景,而wait方法适用于线程等待某个条件满足后再继续执行的场景。