自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zhusihua920712的博客

会编程的猪

  • 博客(28)
  • 收藏
  • 关注

原创 Kafka基础概念

Producer:消息生产者; Consumer:消息消费者; Consumer Group:消费者组,由多个Consumer组成,一个消费者组内同时只能有一个消费者去消费topic,广播模式下,由多个消费者组来消费,互相不影响; Offset:当前Partition的偏移量,每个消费者组对Partition都记录一个自己的Offset; Topic:生产和消费消息的一个队列; Partition:一个Topic可以分为多个Partition,为了并发消费消息,如果需要单个Topic下消息有序,只

2021-07-09 16:47:45 96

原创 分布式事务

分布式事务包含两个方面:一是数据库层面,主要包含XA协议的相关实现,2PC与3PC,像Mysql、Oracle都实现了XA协议,支持分布式事务;因为XA事务有天然的缺陷,无法解决,而且会降低写的性能,所以一般数据库不会使用XA事务,而是采用主备复制、读写分离和分表分库等手段来提供性能瓶颈; 二是业务层面的分布式事务,对多个系统或微服务进行一组原子操作,要么一起成功,要么一起失败,主要的方法有TCC柔性事务、本地消息表、最大努力通知等;2PC2pc也叫两阶段提交,是一种同步阻塞协议,也是一种强一致

2021-07-09 16:47:35 158

原创 Spring AOP及原理

面向切面编程:是对面向对象的一种补充,将对多个对象产生影响的公共行为和逻辑,抽取出来并封装成一个可复用的模块,使代码更好维护,符合开闭原则。例如:日志打印、权限校验、国际化……关键概念: Aspect:切面; JoinPoint:连接点,进行切入的位置; Advice:切面在连接点的操作,包括Around、Before、After等; 实现原理: 静态代理:AspectJ就是静态代理,在编译器就生成代理类,织入到Java对象的字节码里,这种方式性能更好; 动态代理:Spr

2021-07-09 16:47:23 105

原创 Spring事务传播

Spring的事务通过注解来实现,注解本身都是一种代理模式;事务传播机制,主要解决在spring中事务嵌套的问题;PROPAGATION_REQUIRED(默认): 如果存在事务,则加入当前事务,如果没有事务,则开启一个新事务; 如果A调用B,B抛了异常,但是A把B try/catch起来了,那A一样回滚,因为B已经加入A的事务,B抛了异常,整个事务就失败了; PROPAGATION_REQUIREDS_NEW: 无论当前存不存在事务,都开启一个新的事务; PROPAGA

2021-07-09 16:46:23 75

原创 Spring Bean作用域与声明周期

Bean的作用域Singleton:默认作用域,单例模式,每个容器只有一个Bean实例; Prototype:原型模式,每次都产生一个新的bean; Request:为每一个请求新建一个bean,请求结束即销毁; Session:同一个session会话共享一个bean; Global-session:所有会话共享一个bean实例;Bean的生命周期总体流程:实例化 ——> 初始化 ——> 使用 ——> 销毁;细化流程:实例化Bean:通过BeanDefi

2021-07-09 16:46:13 67

原创 Spring IOC及原理

1、IOC:控制反转,借助第三方(IOC容器)来实现相互依赖的对象之间的解耦,使代码与架构的可维护性变强。原理:反射编程,可以根据类名来动态的生成对象,但是反射的速度要比正常生成对象慢;2、DI:依赖注入,是实现IOC的一种方式;3、例子:人是一个对象,杯子也是一个对象,人去握杯子是一个行为,这个行为如果属于人的话,人在实现握这个动作时就需要去依赖杯子的抽象类,这显然不符合常识,难道杯子应该早于人来定义吗?所以杯子应该是被握住,应该将控制权反转,应该是杯子去实现一个HoldAble的

2021-07-09 16:45:37 94

原创 JAVA中的NIO、BIO、AIO

IO主要包括:TCP、UDP、文件IO;以下模型中的非阻塞、多路复用和异步只针对网络IO,和文件IO无关;UNIX五种IO模型1、阻塞式IO模型应用进程发送IO系统调用(recvfrom),然后等待数据到达,直到数据到达才返回,不然就一直处于等待状态;2、非阻塞式IO模型应用进程发起IO系统调用,如果没有数据,也不会阻塞应用进程,而是告诉应用进程晚点再来,然后应用进程一直轮询,直到返回数据;3、IO复用模型使用select或者是epoll这种函数来代替IO系统调用,s

2021-07-08 14:49:43 57

原创 JAVA垃圾回收

垃圾对象分析:引用计数法: 每个对象添加一个引用计数器,每次被引用,计数器+1,失去引用,计数器-1,计数器为0,就应该对象可以被回收了; 没法解决循环引用的问题; 可达性分析法: 从GC Root节点开始,遍历整条引用链,寻找存活节点,回收剩余的对象; 可以作为GC Root节点的对象有: 虚拟机栈中的reference对象; 本地方法栈中的引用对象; 方法区中静态变量的引用对象 方法区中常量的引用对象 引用的分类:强引用: 只要强引用存在,

2021-07-08 14:44:34 136

原创 JAVA内存模型

内存模型1、程序计数器:当前线程正在执行的字节码行号指示器,唯一没有规定OOM的区域;2、JAVA虚拟机栈:由一个一个的栈帧组成,每一个方法的执行,对应着一个栈帧在虚拟机栈中入栈、出栈,可以抛出StackOverflowError(栈深度超过虚拟机栈最大深度)、OutOfMemoryError(虚拟机在扩展时无法申请到内存)异常。栈帧的结构包括:3、局部变量表:连续的内存空间,存放方法参数和局部变量,还有八大基本类型、对象引用(reference)、returnAddress类型..

2021-07-08 11:41:20 105

原创 JAVA线程池

核心参数corePoolSize(核心池大小)线程池可执行的线程数量,包含空闲的;maximumPoolSize(线程池最大大小)线程池所允许的最大线程个数,如果使用了无界队列,则忽略该参数;keepAliveTime(线程存活时间)超过核心池部分的线程最大可存活的时间;workQueue(任务队列)用来保存超出核心池部分的等待线程的阻塞队列;threadFactory(线程工厂)主要是用来给线程重命名的;handler(饱和策略)当线程超过线程池最大大小时,需要执行的策

2021-07-08 11:28:12 71

原创 JAVA并发工具类介绍

Semaphore(信号灯)Semaphore接受一个整形参数,代表有几盏灯,acquire是获取一盏灯,release是释放一盏灯,相当于一个多锁的集合,获取和释放可以不在同一个线程内出现;CountDownLatch(倒计时门栓)接收一个整形参数标识倒计时次数,countDown方法减少一次计时,await方法标识等待直到及时为0才往后执行;CyclicBarrier()接收一个整形参数,代表参与的线程个数,不同线程调用await进入等待,当线程数量达到预设数量时,再一起执行;Coun

2021-07-08 11:27:27 41

原创 Volatile实现原理

正常线程在读写变量时,都是先操作自己工作内存中的变量,再通过Store操作写回主内存,这在并发情况下就会出现数据不一致的情况;可见性:底层加上了汇编的lock前缀指令,锁定缓存,并写回主内存,其他处理器通过嗅探机制使自己的缓存无效;防止指令重排:增加了内存屏障;硬件屏障Load Barrier:指令前插入,可使缓存失效,从主内存中读; Store Barrier:指令前插入,可使最新数据直接写入主内存,并让其他线程可见;Java屏障Java基于这两个屏障组合出...

2021-07-08 11:26:23 125

原创 CAS实现原理

缓存锁定:当前处理器大部分都是使用缓存锁定来实现CAS,当某个线程操作了共享变量后,其他的处理器会有缓存嗅探机制,将其处理器中的缓存失效,重新从内存中读取缓存,基于MESI缓存一致性协议实现; 总线锁定:当一个处理器要操作共享变量时,会向总线BUS发出锁定信号,其他处理器就无法操作这个缓存了,但是会导致其他线程阻塞,增加性能开销;某些过于老旧的处理器不支持缓存锁定;当操作多个缓存行时或数据没被缓存时,就需要总线锁定;处理器在执行的过程中会一直嗅探总线上对于当前缓存数据的修改,来保证MES..

2021-07-08 11:25:10 68

原创 Threadlocal原理及内存泄漏原因

ThreadLocal:线程间共享的全局变量; ThreadLocalMap:是ThreadLocal实现线程隔离的关键,每个线程独立维护一个这样的Map,Map的结构单元是Entry,Entry的可以是指向ThreadLocal的弱引用,value是ThreadLocal里存的值;弱引用在下一次GC时一定会被回收,而现在的线程都是通过线程池创建,生命周期不会结束,这样就会造成线程内的Map中有存在Key为null的值,永远不会被访问到了,这就造成了内存泄漏的风险;在Java1.8之后,Thre

2021-07-08 11:22:44 138

原创 ReentrantLock基础及原理

获取锁的方式:lock():获取不到就休眠,且不响应中断; tryLock():获取不到就返回false; tryLock(timeOut):timeOut时间内获取不到就返回false; lockInterruptibly():功能和lock一样,但是可以相应中断,抛出异常;公平锁:公平锁的实现比非公平锁多调用了hasQueuedPredecessors方法,判断如果同步器队列中有线程等待,则直接接入队尾;AQS资源:state,全局共享,被设置为volatile,通过CAS来操作

2021-07-08 11:20:41 114

原创 Synchronized基础及原理

锁类型类锁 修饰静态方法; 修饰类 以类.class为锁; 以静态变量为锁; 对象锁 修饰普通方法; 以实例对象为锁; 以局部变量为锁; 显式锁/隐式锁锁代码块是显式锁,通过MonitorEnter和MonitorExit实现; 锁方法是隐式锁,通过ACC_SYNCHRONIZED来标记方法为同步方法,调用方法前,先获取monitor;MarkWord(对象头)Java中每个对象分为三块区域:对象头、实例数据和对齐填充;对象头就是MarkWord;

2021-07-08 11:19:18 223

原创 Java中的线程和锁

线程的状态1、初始态(NEW)实现Runable接口,或继承Thread类new一个线程;2、就绪态(RUNABLE)调用start()方法;3、运行态(RUNNING)线程从就绪态被CPU调度,获取时间片;4、阻塞态(三种) 1、BLOCKED ——这种状态是指一个阻塞线程在等待monitor锁;synchronized竞争锁失败; 2、WAITING ——一个线程在等待另一个线程执行一个动作时在这个状...

2021-07-07 15:44:12 248

原创 ConcurrentHashmap详解

1.7基础知识:通过Segment数组加HashEntry数组实现,Segment相当于一级hash表,一共16个,继承自ReentrantLock,是锁分段技术; 每一个HashEntry里的value都是volatile修饰的,保证其可见性,但不保证原子性; ConcurrentHashmap值和键都不能为null,多线程下容易造成歧义,因为需要根据返回值是否为null来判断节点是否被占用;Get根据key计算hash值,定位到Segment; 再次hash,定位到Segment中的

2021-07-07 15:23:27 415

原创 HashMap详解

常用集合ArrayList :变长数组,线程不安全,初始大小10,每次扩容1.5倍;LinkedList:双链表,读和更新差于ArrayList,增和删好于ArrayList;Vector:古老的类,线程安全的ArrayList,每次扩容2倍;HashSet:互异、无序的集合,基于HashMap实现,写入Key中实现去重;LinkedHashSet:互异、有序的集合,继承自HashSet;TreeSet:支持自然排序和定制排序,基于TreeMap实现;HashMap:无序的键

2021-07-07 15:12:57 87

原创 分布式缓存算法

普通Hash算法:以机器数量为基数,对缓存key值进行hash取模,如果某台机器挂了,挂掉的机器上的缓存需要全部重建,并且因为机器基数变了,Key值的hash取模结果也会变,会命中与之前不同的机器,导致大量的缓存重建;一致性Hash:一个标准的2^32-1的环; 所有的物理机器全都映射成150个虚拟机器,均匀的映射到hash环上;(是为了在机器较少的情况下,数据也能均匀分布) 所有的数据也都hash映射到环上,顺时针找到第一个机器来存储; 增加和删除节点,影响范围较小,且均匀;Redis

2021-07-07 15:01:56 137

原创 redis与mysql双写数据不一致问题

三种更新策略:先更新数据库,再更新缓存(线程不安全)1、线程A更新了数据库;2、线程B更新了数据库;3、线程B更新了缓存;4、线程A更新了缓存;数据库是B写入的值,而缓存中是A写入的旧值写多读少的场景,频繁写缓存很浪费性能;先删缓存,再更新数据库(线程不安全)1、线程A删除了缓存;2、线程B查询缓存发现不存在;3、线程B更新了缓存;4、线程A写入了数据库;数据库是A写入的值,而缓存中是B写入的旧值可以使用延时双删策略进行优化;延时双删:先删..

2021-07-07 14:50:01 124

原创 redis缓存击穿、穿透、血崩

缓存穿透问题原因:查询一个缓存中和数据库都一定没有的值,有人可以利用不存在的Key发起大量请求,攻击数据库;解决方案:数据库如果也查不到这个值,可以往缓存中回写一个空值,设置一个非常短的过期时间,防止同一时间,大量并发请求打到数据库,导致数据库瘫痪; 增加布隆过滤器,类似于hashSet,将所有存在的值放到布隆过滤器里,迅速判断key值的数据是否存在;缓存击穿问题原因:一个非常热点Key,扛着大量的并发请求,某一时刻,Key失效,大量请求打到数据库;解决方案:热点Key设

2021-07-07 14:43:24 207

原创 redis持久化

RDB优点:结构紧凑,全量备份,适合容灾恢复与备份; 生成RDB文件时,redis会根据主进程fork一个子进程进行保存,主进程还可以继续读写操作; RDB恢复大数据量时比AOF要快;缺点:子进程保存RDB文件时,主进程还在继续读写,有可能会丢失数据;AOFredis会将每一个收到的写命令都通过write函数追加到AOF文件;aof触发机制:always:每次修改完同步,性能较差,数据完整性好; everysec:异步,每秒记录,一秒内宕机,会有数据丢失; no:从不同步

2021-07-07 14:40:20 39

原创 redis常用数据结构

5种数据结构:String:简单的KV存储;Hash:存结构化数据;List:有序列表,可以做为消息队列,可以实现区间查询;Set:无序集合,自动去重;ZSet:排序后的Set;基础知识:Ziplist压缩列表,redis特有数据结构,list、hash、zset底层数据结构,在元素个数小于某个值时,数据结构会变成ziplist; 为什么压缩列表节省内存? 记录了每个数据的大小,即偏移量,通过偏移量来取下一个数据,省去了碎片空间,并且省去了头尾指针,共16字节; L.

2021-07-07 14:31:22 75

原创 Mysql中的各种日志

Binlog主要作用:主从复制,Master端开启binlog,再将二进制日志传递给slaves回放,来达到数据一致性的目的; 数据恢复; 增量备份;格式:binlog 日志有 Row、Statement、Mixed 三种格式。可以通过 my.cnf 配置文件及 set global binlog_format='ROW/STATEMENT/MIXED'进行修改Row格式Row 格式仅保存记录被修改细节,不记录 sql 语句上下文相关信息。新版本的 MySQL 默认是 Row 格式

2021-07-07 14:26:56 60

原创 MYSQL死锁分析

死锁处理:等待,直到超时(50S); 发起死锁检测,主动回滚一条小事务;死锁预防:尽量使用唯一索引,减小锁的粒度; 使用小事务; 操作完了立马提交事务; 不要锁表; 单一事务,尽量重复用一样的锁;信息收集:利用命令 SHOW ENGINE INNODB STATUS查看死锁原因。 调试阶段开启 innodb_print_all_deadlocks,收集所有死锁日志。间隙锁不互斥,临键锁和行锁的S锁、X锁都会互斥,产生死锁;...

2021-07-07 14:20:57 84

原创 Mysql事务与隔离级别

基础总览ACID:原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability)脏读:读到了其他事务未提交的数据;不可重复读:同一事务内,两次相同的查询返回了不同的结果;幻读:主要针对于新增和删除,在A对一批数据进行修改后,未提交时,B事务新增了一条记录,导致A好像少修改了一条数据一样; 隔离级别 脏读 不可重复读 幻读 读.

2021-07-06 23:18:47 68

原创 Mysql索引总结

1、索引分类Hash索引Hash 索引查询效率很高,时间复杂度O(1)。Mysql Innodb引擎不支持hash索引的。Hash索引适合精确查找,不适合范围查找。平衡二叉树时间复杂度为 O(n),根节点会变,数据量多,层次多,磁盘IO多。B树每个节点中不仅包含数据的 key 值,还有 data 值。数据量较大的时候,同样会导致B树很深,从而增加了磁盘 IO 的次数。B+树所有的数据节点都在最后一层上,叶子节点按关键字排序,从左到右指针连接,层级更少,查询稳定。2、主键索引.

2021-07-06 22:43:47 54

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除