03 2023 档案
摘要:主从复制: 之前说的RDB和AOF,都是为了帮我们尽快从宕机恢复过来,是宕机之后的处理方式。从根本上,我们应该尽可能的避免宕机的可能性 高可用的三大模式:主从复制,哨兵,集群。 首先是要有主节点和从节点,这个根据业务的需求来判断,主从复制就是从主节点同步数据到从节点。 为了减轻服务器的压力,我们采用
阅读全文
摘要:Redis为什么快? 前面讲了独有的数据结构+IO模型的选用。 除此之外还有什么因素的加持呢? 1.内存存储,避免磁盘IO的开销,提高读取速度 2.网络模型,使用Reactor模型,处理大量连接请求,同时保持低延迟和高吞吐 3.单线程处理请求。但是RDB,AOF等场景会用到多线程模式。 所以Redi
阅读全文
摘要:Springboot的自动装配原理: @SpringBootApplication 进入 AutoConfigurationImportSelector类中,会调用 selectImports(方法),用于选择需要自动配置的类,并返回它们的全限定类名数组 AnnotationMetadata 是被注
阅读全文
摘要:AOP: 我们有一个简单的java类,我们希望给操作前后加日志。 public class UserService { public void saveUser(User user) { // 保存用户到数据库 System.out.println("Save user: " + user); }
阅读全文
摘要:扩展点: BeanPostProcessor:在 Bean 初始化前后进行一些处理,常用于 AOP 功能的实现。 postProcessBeforeInitialization(初始化bean前) postProcessAfterInitialization(初始化bean后) BeanDefini
阅读全文
摘要:3.this.refresh(): refresh的整体结构 1.Spring应用上下文启动准备阶段 this.prepareRefresh(); 记录了应用程序的启动时间,并设置为活跃状态。 根据日志的打印规范打印所需内容 初始化属性(系统变量、环境变量、配置文件等)并进行验证。 这段代码: 如果
阅读全文
摘要:Spring启动过程? tips: BeanDefinition的定义: Spring是Bean的容器,Bean和普通的java实例的区别就在于bean在java的实例上加入了一些Spring封装的属性(作用域,加载模式,是否单例等...) BeanDefinition就是用来实例化对应的bean。
阅读全文
摘要:内存模型: java内存模型定义了JVM虚拟机如何与计算机的内存进行交互。java内存模型把内存划分为两部分:主内存和工作内存。主内存共享,工作内存线程私有。 java内存模型的实现有两种:基于锁的同步和volatile、 基于锁的同步和synchronized 线程私有变量可以通过ThreadLo
阅读全文
摘要:JVM的内存结构: 1.程序计数器:线程私有,保存执行指令地址。 2.java虚拟机栈(线程创建,并存方法调用的相关参数): 每个线程在创建时候都会被分配一个虚拟机栈。当线程调用方法时,会创建一个栈帧,入栈,方法执行完毕栈帧出栈。 栈帧会在调用方法的时候把存局部变量表,操作数栈,动态连接,方法出口等
阅读全文
摘要:泛型: 为什么说Java是假泛型? java的泛型是伪泛型。Java 的泛型仅仅在编译期有效,在运行期则会被擦除,也就是说所有的泛型参数类型在编译后都会被清除掉。 例如我们无法向List<String>的集合中add进Integer类型的对象,但是如果我们通过反射,可以对add方法invoke进In
阅读全文
摘要:反射的用法和场景: 1.newInstance()创建对象: 首先需要获取类对象 Class class = Entity.class 获取class后,创建对象可以通过: Entity entityclass = (Entity)class.newInstance() 进行对象的创建 如果类有自己
阅读全文
摘要:线程池的核心线程如何回收? 首先要了解线程池的状态:Runing: 运行状态,能接受新任务并处理任务 Shutdown:不再接受新任务,但是能处理已添加的任务。调用shutdown()后,由Running >shutdown stop:不接受,不处理,所有处理任务停止。 调用shutdownNow(
阅读全文
摘要:线程池的拒绝策略: • CallerRunsPolicy - 当触发拒绝策略,只要线程池没有关闭的话,则使用调用线程直接运行任务。一般并发比较小,性能要求不高,不允许失败。但是,由于调用者自己运行任务,如果任务提交速度过快,可能导致程序阻塞,性能效率上必然的损失较大 • AbortPolicy -
阅读全文
摘要:再Synchronized和ReetrantLock的区别: 1.Synchronized可以对静态方法,普通方法,代码块加锁。自动加锁释放锁。ReetrantLock需要手动的加锁释放锁,加锁前需要创建一个ReetrantLock对象2.Synchronized是非公平锁,竞争获取。Reetran
阅读全文
摘要:copyOnWrite容器用途 写时复制机制,在修改操作时,复制一个副本,修改副本,再修改完后再替换回去。避免了高并发期间的竞争。 使用场景: 对于一些读多写少的数据,写时复制的做法就很不错,例如配置、黑名单、物流地址等变化非常少的数据,这是一种无锁的实现,可以帮我们实现程序更高的并发 CopyOn
阅读全文
摘要:读写锁有哪些? juc的locks包的readwriteLock接口和ReentrantReadWriteLock类来实现。 ReentrantReadWriteLock: 最常见的读写锁,读共享,写互斥。可重入。 锁降级:获取写锁,获取读锁,释放写锁。 需要严格按照这三步来做,获取读锁是为了让其他
阅读全文
摘要:1.CLH队列的实现 SMP(对称多处理器结构),保证CPU的内存一致性,但是可能内存访问冲突和资源浪费。 NUMA(非一致存储访问),将CPU分模块,每个模块多CPU组成,具有独立本地内存和插槽进行互联互通。本地内存的速度远高于系统其他节点的内存速度。 普通的自旋锁: 对某一原子变量,例如当前线程
阅读全文
摘要:今日目标(AQS): AQS(抽象队列同步器): 相当于实现锁的一系列模板方法。 如果要实现锁,需要: 1.锁是否被占用的状态值。 2.阻塞/唤醒 3.竞争失败的队列 AQS中: state:状态信息,不同的锁的用途不同 Node:阻塞队列等的节点信息(pre,next,thread)都是用vola
阅读全文
摘要:Mysql持久性是如何实现的? redolog: CRUD操作后更新整个页到buffer pool中,然后在内存修改数据,但是不会马上刷新到磁盘,如果一条操作去刷新一个页会有性能浪费。 redolog说白了就是一个记录数据修改记录的日志,而且它是循环写入固定文件(会用完空间,binlog追加写不会用
阅读全文
摘要:磁盘预读机制: mysql有时会有这样的操作场景,就是对某个大数据量的表进行全表扫描。那么此时会将buffer pool中的缓存页全部淘汰掉,存进这些全表扫描的数据。那么当下一波热点数据的请求进来的时候,就又需要从磁盘去读取数据到缓存页中,会导致IO开销增加。 所以MYSQL对LRU进行了改造,分为
阅读全文
摘要:写入慢: 1.合并sql来降低日志量,降低日志刷盘的数据量和频率,从而提高效率。 例如: insert into 表 (对应字段) values (插入的行数据); insert into 表 (对应字段) values (插入的行数据) -->合并成一个sql: insert into 表 (对应
阅读全文
摘要:建索引的几大原则 1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c
阅读全文
摘要:高性能Mysql第四版P190~204 学习记录: 联接查询: 对于Union查询,mysql先把一系列单个查询放在临时表,然后再重新读出临时表中的数据完成Union查询。 在Mysql的概念中,联接作用于每个查询,所以对临时表的读取也是一次联接。 Mysql执行联接的策略是:先在一个表取出单条数据
阅读全文
摘要:Mysql的执行流程: 解析和预处理验证语法是否合理合法。然后由优化器转换成执行计划。一条查询很多种执行计划都可以返回相同的结果,优化器需要选择一条最优的解。 Mysql使用基于成本的优化器,预测执行计划的成本并选择最优。 可以使用last_query_cost来看当前会话的成本。 数值为优化器认为
阅读全文