07 2020 档案
摘要:保证消息可靠性 生产者发送消息到broker的可靠性 服务端确认机制 channel设置为事务模式(transaction模式):缺点:阻塞、性能下降;消耗额外的性能,不建议生产环境使用。 confirm模式:waitForConfirm(),发送成功后会confirm;可以批量确认,提升性能;还可
阅读全文
摘要:连接 服务端 控制连接超时时间,总连接数 客户端 使用连接池(连接池里连接数量不是越大越好,默认8-10个) SQL Explain 索引 最左匹配原则 分表分库 垂直拆分 水平拆分 主从复制 从服务器:I/O Thread:请求master获取binlog,然后写入到relay log里;从服务器
阅读全文
摘要:事务的特性 ACID 原子性 一致性 隔离性 持久性 通过redolog 和 doublewrite(页损坏的情况) 实现持久性 事务什么时候开启 默认自动开启,自动提交。 通过begin;命令显式开启事务;通过commit;/rollback;结束事务。 事务的隔离级别 读未提交 存在的问题:脏读
阅读全文
摘要:索引 一个排序的数据结构,用来协助提升查询效率。InnoDB中是B+树。 Page InnoDB中存储数据的最小逻辑单位,一个页16KB,存储多个行。 一个节点上就是一个页的大小,页的数据在节点中。加载节点的次数越多,I/O寻址的次数越多。B+树矮胖 减少了寻址次数。 B+树和B树区别 关键字数和分
阅读全文
摘要:MYSQL执行流程 建立连接 连接协议:TCP/IP、Unix Socket 通信方式:半双工 发送请求 查询缓存(默认缓存不开启) 解析器 词法解析 语法解析 生成解析树 预处理 语义解析 得到新的解析树 优化器 选择开销最小的执行计划 查询执行引擎(执行器) 存储引擎 概念:存储引擎是组织数据存
阅读全文
摘要:什么时候会发生垃圾回收 MinorGC:Eden区或者S区不够用了 MajorGC:老年代不够用了 FullGC = MinorGC + MajorGC + MetaSpace GC System.gc()(该方法不会立即唤起gc ) 什么时候需要调优 出现问题:频繁GC?cpu高 >打印GC日志
阅读全文
摘要:参数 标准参数:不会随着JDK版本的变化而变化 java -version/-help -X参数: 非标准参数:随着JDK版本变化而变化 Xint:解释执行 Xcomp:编译执行 Xmix:混合执行 -XX参数 boolean类型 -XX:[+/-]name:启动或停止 -XX: +UseSeria
阅读全文
摘要:判断对象是否存活 引用计数 假如对象被引用,则计数加1,计数为0时回收。但是存在循环引用问题:A引用B,B引用A,导致AB永远不能被回收。 可达性分析(JAVA采用的算法) 从GC Root出发看某个对象是否可达。假如不可达,则回收。 GC Root:存活时间很长的对象,有存在意义的对象。 虚拟机栈
阅读全文
摘要:堆 上次我们说到了堆主要存在对象和数组,实际上,在堆中还有更细节的分代划分。GC算法也是基于分代划分来回收的。 新生代Young:新创建的对象(大多数对象都是朝生夕死,生命周期很短) Eden SurvivorFrom SurvivorTo 默认E:S0:S1 = 8 :1 :1 老年代Old 对象
阅读全文
摘要:类加载机制 Load:装载类信息 ClassLoader:类加载器 双亲委派:加载器对一个类加载器会先让父类加载器加载,假如父类加载器找不到该类,才让子类加载器加载 Linking:连接 verify(验证):保证被加载类的正确性 prepare(准备):为类的静态变量分配内存空间,变将其的值初始化
阅读全文
摘要:Jedis 连接 sentinel:直接连sentinel,通过sentinel获取master的地址然后封装成连接 cluster:缓存了slot到node的映射关系,调用的时候根据映射关系获取对应的connectPool(pool在这里其实就代表对应node的连接) Pipeline 缓存命令,
阅读全文
摘要:主从复制 master-slave(replication) 从节点上只能读数据,不能写入数据,只能在主节点写入数据。主节点的数据会自动同步到从节点。 复制原理: 从节点第一次加入后和主节点建立连接 建立连接后主节点通过bgsave生成RDB文件,再将文件发送到从节点(假如超时则会重发) 新来的指令
阅读全文
摘要:高级特性 简单消息队列 可以用list的rpush+lpop实现简单的消息队列功能(用blpop可以阻塞连接直到有消息时才返回) 发布订阅模式 消费者通过subscribe订阅一个频道,生产者通过publish发布消息到频道,实现多条发布。 通过unsubscribe取消订阅。 订阅的频道可以用通配
阅读全文
摘要:Redis数据类型 KV形式存储,KEY是String,最大容量512M,V有以下几种类型: String:命令set,get;字符串,底层数据结构就是SDS Hash:命令hset,hget;entry数量少的时候用ziplist(节省空间,实际上不是链表,放在连续的空间里,性能比哈希差一点,取头
阅读全文
摘要:线程池的好处 降低频繁创建、销毁线程的开销 便于统一管理线程(数量等) 提高响应时间 Java中的线程池 Executors:创建线程池的工厂类。 Executors.newFixedThreadPool(nThreads):创建固定大小的线程池。 Executors.newCachedThread
阅读全文
摘要:阻塞队列 插入元素 add():添加元素,满了抛异常。 put():添加元素,满了之后会阻塞。 offer():添加元素,添加失败后返回false。 offer(time):添加元素,阻塞一段时间后失败返回false,假如在这期间队列有位置了则添加成功。 删除/获取元素 remove():从队列中获
阅读全文
摘要:线程安全的集合ConcurrentHashMap JDK1.7和JDK1.8的区别 1、取消了segment分段设计 2、增加了链表转红黑树的设计 基本原理和HashMap差不多,不熟悉的同学可以先去看看HashMap的结构,本文主要看其对并发安全的设计 ConcurrentHashMap中重要的并
阅读全文
摘要:Condition condition.await() > aqs.await():1、先addConditionWaiter(),把当前节点加入到Condition队列中(等待队列),waitStatus=-2,这个入队的流程和AQS有些类似,但是这里没有空的头结点,入队的线程节点自身就是头结点,
阅读全文
摘要:从Lock讲起 Lock:一个接口,定义了在jdk层面上灵活实现锁的一种方式。 实现该接口的类是ReentrantLock。ReentrantLock这个单词的翻译是重入锁。 重入锁 持有锁的线程可以再次获取锁,增加重入次数,释放的锁时候也要将次数减为0。synchronized和Reentrant
阅读全文
摘要:Volatile关键字 保证线程间共享变量的可见性、有序性。 如何保证可见性:多了一个Lock的汇编指令。 什么是可见性 硬件 运行速度:CPU > 内存 > IO设备;所以在硬件的使用中,为了提高效率 CPU增加了高速缓存 读数据时,从内存读,然后缓存到CPU缓存,线程修改变量时会先同步到缓存,再
阅读全文
摘要:wait & notify/notifyAll 通过之前的文章,https://www.cnblogs.com/fcb-it/p/13282740.html 我们已经知道了重量级锁会存在等待队列和阻塞队列,这两个队列是做什么用的呢? 阻塞队列:BLOCKED状态的线程会在该队列,当发现锁可用时,线程
阅读全文
摘要:synchronize的使用场景 线程安全问题:多线程对共享数据状态的访问没有控制 用锁(互斥)来控制对共享数据的访问 synchronized是虚拟机级别提供给我们的同步关键字 synchronized的使用 1、修饰实例方法(锁是当前对象) 2、修饰静态方法(锁是当前类的字节码对象) 3、修饰代
阅读全文
摘要:线程中的Interrupt 线程中存在volatile变量Interrupt,用来标记是否中断。 线程中存在对应的isInterrupted()方法,默认是false。调用thread.interrupt()会把isInterrupted()设置成true。 线程的中断和复位 调用thread.in
阅读全文
摘要:为什么需要多线程 单核CPU->多核CPU->并行计算 实时性需求->线程是轻量级的进程,任务调度的最小单位,资源消耗比进程低 充分利用CPU资源,提升吞吐量 线程在Java中的应用 四种方式创建多线程: 继承Thread类(本质上是实现了Runnable接口) 实现Runnable接口扔到Thre
阅读全文
摘要:SqlSessionFactory何时创建 容器启动时创建 能否直接使用DefaultSqlSession 不能,因为该类不是线程安全的,直接用会有问题,Spring环境中使用了SqlSessionTemplate类代替 为什么SqlSessionTemplate是线程安全的:SqlSessionT
阅读全文
摘要:哪些对象允许被代理(插件) Executor、ParameterHandler、StatementHandler、ResultSetHandler 什么时候创建代理对象 Executor sqlSession.openSession的时候被代理 其他3个创建的时候被代理 多个插件的时候,代理执行顺序
阅读全文
摘要:主要流程 解析配置文件 创建工厂类 创建会话 会话操作数据库 架构分层 SqlSession 如果代码在事务里,一次请求的SqlSession一样,否则每次都会创建一个SqlSession。 缓存 一级缓存(默认开启):作用域:SqlSession级别。存放在SqlSession中的Excutor里
阅读全文
摘要:核心对象 SqlSessionFactoryBuilder:一次性使用,用来产生工程类 SqlSessionFactory:单例,应用的全局生命周期,一直使用 SqlSession:每次调用mapper方法的时候产生一个 Mapper:和SqlSession一样 TypeHandler 用来做类型转
阅读全文
摘要:为什么有事务传播行为 Spring中,开启事务的常见方法是添加@Transactional注解,通过AOP实现事务管理。 但问题是,我们可能在不同类的多个互相调用的方法上加上这个注解,这样我们开发者对底层事务切面的逻辑就不清楚了。所以Spring定义了事务的传播行为这个东西帮我们解释了这种情况底层会
阅读全文
摘要:SpringMVC执行流程 初始化阶段:web应用会初始化前端拦截器DispatcherServlet,初始化的同时会走一遍常规的IOC启动流程,并把九大组件放入到容器中,其中最重要的三个是处理器映射器(handlerMappings)、处理器适配器(handlerAdapter)、视图解析器(Vi
阅读全文

浙公网安备 33010602011771号