DNS解析:获取该域名对应的IP地址
浏览器建立TCP连接:三次握手———>发送http请求
服务器处理请求
接收HTTP响应 浏览器渲染页面 关闭TCP连接
可能存在一下几个原因:
1.数据库同步存在问题;可能存在同步延迟,同步错误。
2.缓存问题:使用缓存来提高性能,但是缓存中数据已经过期,或者被修改。
3.并发访问问题
数据库同步和数据一致性保证
缓存管理:如缓存过期策略,数据库和缓存数据保持一致性。
并发访问控制:使用锁或事务,保证共享资源的正确访问。
B树、B+树、哈希索引、全文索引、空间索引
1.程序中存在循环或者循环产生过多的对象实体,导致内存不断增长
2.对象是可达的
在Java中,对象是可达的意味着虽然该对象不再被程序使用,但是系统中仍然存在引用指向该对象。因为垃圾回收器无法回收仍被引用的对象,所以这些对象会一直占据内存空间。
解决方法:
尽早释放无用对象,或显式的置为null。
模拟实际的工作环境,发现可能发生内存泄漏的问题
3.程序使用了nio直接操作内存,导致内存过大
JDK 1.7:中 ConcurrentHashmap采用了数组+Segment + 分段锁的方式实现。
JDK 1.8:中ConcurrentHashmap采用了数组+链表+红黑树的实现来设计,内部采用大量的CAS操作
ConcurrentHashMap的底层结构由多个Segment组成,每个Segment都是一个独立的哈希表。每个Segment都维护了一个数组结构,该数组的每个元素都是一个链表或红黑树。每个Segment都可以独立地加锁,减小锁的粒度,每个线程在访问ConcurrentHashMap时,只需要获取对应Segment的锁,从而提供了更高的并发性能。
Compare and Swap是一种基于锁的操作,乐观锁的一种实现方式。它用于在多线程环境下保证数据的一致性和并发性。
CAS操作包含三个操作数:内存地址(或变量)、旧的预期值、新的预期值
执行过程:
读取内存地址中的当前值和旧的值比较,如果当前两个值相等,将新的值写入内存地址,完成操作,如果当前值不等于旧的预期值,则说明其他线程已经修改了该内存地址的值,操作失败。
CAS操作的特点是乐观锁,它并不直接对数据进行锁定,而是通过比较和交换的方式来实现数据的一致性。
CAS(Compare and Swap)操作中可能会遇到ABA问题,这是指一个值被另一个线程修改后,又改回原来的值,CAS操作无法判断这个值是否被其他线程修改过。
1.使用带版本号的CAS操作,每次修改数据同时修改版本号,在CAS操作时,同时检查版本号是否一致,都一致再进行交换操作
2.使用带标记的CAS操作,在CAS操作是,还需要比较替换标记。每次进行修改操作时,都会改变标记的值。如果值恢复原来的值,但是标记也会发生变化。
持久化方式有两种:AOF和RDB
AOF:以独立日志的方式记录,等服务器重启,可以执行AOF日志文件以达到恢复数据的目的。流程:命令写入,文件同步、文件重写、重启加载。
RDB:把当前进程数据生成的快照文件保存到硬盘的过程。RDB文件是一个压缩的二进制文件,通过它可以还原某个时刻数据库的状态。
触发RDB持久化分为手动和自动;
自动触发:
手动触发分别对应save和bgsave命令:
save:阻塞当前的Redis服务器,知道RDB过程完成。
bgsave:Redis进程执行一个fork操作创建子线程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork进程阶段,一般时间很短。
强一致性:数据库数据更新,立即更新缓存中的数据。但这会影响性能。
事务:确保操作的原子性
配置数据库的主从复制或者集群复制,可以保证数据在多个实例之间的一致性。
内存区域:程序寄存器,方法区、堆区、本地方法栈、虚拟机栈
堆区被分为:新生代和老年代,新生代被分为Eden空间、Survivor空间(S0、S1)
新生代的垃圾回收:
内存溢出是指无法获得所需的内存空间,导致程序无法正常执行;
而内存泄漏是指程序未能正确释放已经不再使用的内存空间,导致内存被长时间占用而无法回收。内存溢出是内存泄漏的一种可能结果,但内存泄漏不一定会导致内存溢出。
创建数据库表 存储用户信息。
连接数据库
插入数据,将用户信息插入表中,可以使用预编译,参数化查询防止sql注入
关闭连接
两种类型的动态代理:
默认隔离级别,可重复读。解决了脏读、和不可重复读,但幻读仍有可能发生。
mvcc是一种并发控制机制,用于在数据库系统中处理并发事务的读写冲突。
mvcc在修改数据时,会创建数据的副本,而不是直接修改原始数据。每个事务读取数据时,会根据事务开始的时间戳或版本号来决定可见的数据版本。每个事务看到一致的快照数据,避免了脏读、不可重复读和幻读的问题。
vim 查看文件,cd 切换目录 sudo 切换用户 linux设置权限命令、chmod 777
sleep和wait都是用于线程控制的方法,但在使用和效果上有一些区别。
即:sleep方法适用于线程暂停执行一段时间后继续执行的场景,而wait方法适用于线程等待某个条件满足后再继续执行的场景。