自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 机器学习理论基础

⽽机器学习的过程就是要从已有的房价数据中学习到房价之间的规律,然后以后再来⼀个房⼦,我们就可以根据房⼦的这些属性,预测他的房价是多少。机器学习通过数据收集-》数据清洗-》模型训练-》模型优化这一系列过程,提炼出自己的机器算法,而通过这一算法,针对同一个数据集上进行训练,并且把数据集的特征值拆分为不同层次时,得出的结果往往会有差异。,他强调的是从仿⽣学的⻆度,来模拟⽣物体的结构,其中重点就是⼈脑的结构(其实就是深度学习领域的范畴)。有很多都是⼀些公司⾃⼰处理不了的实际数据,数据集的质量通常都是⽐较⾼的。

2023-07-09 18:16:22 132 1

原创 未来架构之道DDD领域驱动设计

浅谈DDD领域驱动设计

2022-11-10 19:03:02 958 1

原创 Dubbo服务调用源码解析

Dubbo服务调用链路解析

2022-07-02 16:48:43 541

原创 深入底层C源码剖析Redis底层数据结构

Redis 基本特性1. 非关系型的键值对数据库,可以根据键以O(1) 的时间复杂度取出或插入关联值2. Redis 的数据是存在内存中的3. 键值对中键的类型可以是字符串,整型,浮点型等,且键是唯一的4. 键值对中的值类型可以是string,hash,list,set,sorted set 等5. Redis 内置了复制,磁盘持久化,LUA脚本,事务,SSL, ACLs,客户端缓存,客户端代理等功能...

2022-05-14 16:30:08 133

原创 Spring Bean的生命周期

1. 实例化Bean对象,这个时候Bean的对象是非常低级的,基本不能够被我们使用,因为连最基本的属性都没有设置,可以理解为连Autowired注解都是没有解析的; 2. 填充属性,当做完这一步,Bean对象基本是完整的了,可以理解为Autowired注解已经解析完毕,依赖注入完成了; 3. 如果Bean实现了BeanNameAware接口,则调用setBeanName方法; 4. 如果Bean实现了BeanClassLoaderAware接口,则调用setBeanClassLoad

2022-05-04 14:48:52 418

原创 MySql之MVCC多版本并发控制以及Buffer Pool图解

Mysql在可重复读隔离级别下如何保证事务较高的隔离性,列如同样的sql查询语句在一个事务里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果。 这个隔离性就是靠MVCC(Multi-Version Concurrency Control)机制来保证的,对一行数据的读和写两个操作默认是不会通过加锁互斥来保证隔离性,避免了频繁加锁互斥,而在串行化隔离级别为了保证较高的隔离性是通过将所有操作加锁互斥来实现的。Mysql在读已提交和可重复读隔离级别下都实现了MVCC机

2022-04-20 10:21:41 73

原创 JVM调优实战

系统频繁Full GC导致系统卡顿是怎么回事?以下为业务场景出现的问题:机器配置:2核4G JVM内存大小:2G 系统运行时间:7天 期间发生的Full GC次数和耗时:500多次,200多秒 期间发生的Young GC次数和耗时:1万多次,500多秒 大致算下来每天会发生70多次Full GC,平均每小时3次,每次Full GC在400毫秒左右; 每天会发生1000多次Young GC,每分钟会发生1次,每次Young GC在50毫秒左右。JVM参数设置如.

2022-04-13 22:15:02 565 2

原创 高并发编程必备知识IO多路复用技术select、poll、epoll讲解

什么是IO多路复用:I/O多路复用,I/O是指网络I/O, 多路指多个TCP连接(即socket或者channel),复用指复用一个或几个线程。简单来说:就是使用一个或者几个线程处理多个TCP连接,最大优势是减少系统开销小,不必创建过多的进程/线程,也不必维护这些进程/线程select: 基本原理:监视文件3类描述符: writefds、readfds、和exceptfds,调用后select函数会阻塞住,等有数据 可读、可写、出异常 或者 超时 就会返回, select函数正常返回后,.

2022-04-06 22:45:35 656

原创 Flink乱序延迟时间处理-Watermark

背景 一般我们都是用EventTime事件时间进行处理统计数据 但数据由于网络问题延迟、乱序到达会导致窗口计算数据不准确 需求:比如时间窗是 [12:01:01,12:01:10 ) ,但是有数据延迟到达 当 12:01:10 秒数据到达的时候,不立刻触发窗口计算 而是等一定的时间,等迟到的数据来后再关闭窗口进行计算 生活中的例子 xx公司:每天10点后就是迟到,需要扣工资 老王上班 路途遥远(延迟) 经常...

2022-04-04 22:41:53 1612

原创 Flink的多种时间概念介绍和应用场景

Flink里面时间分类 事件时间EventTime(重点关注) 事件发生的时间 事件时间是每个单独事件在其产生进程上发生的时间,这个时间通常在记录进入 Flink 之前记录在对象中 在事件时间中,时间值 取决于数据产生记录的时间,而不是任何Flink机器上的 进入时间 IngestionTime 事件到进入Flink 处理时间ProcessingTime 事件被flink处理的时间 指正在执行相应操作的..

2022-03-25 14:25:32 2336

原创 多线程的synchronized源码剖析以及新版JDK里面优化点

synchronized是解决线程安全的问题,常用在 同步普通方法、静态方法、代码块中非公平、可重入每个对象有一个锁和一个等待队列,锁只能被一个线程持有,其他需要锁的线程需要阻塞等待。锁被释放后,对象会从队列中取出一个并唤醒,唤醒哪个线程是不确定的,不保证公平性两种形式:方法:生成的字节码文件中会多一个 ACC_SYNCHRONIZED 标志位,当一个线程访问方法时,会去检查是否存在ACC_SYNCHRONIZED标识,如果存在,执行线程将先获取monitor,获取成功之后才.

2022-03-13 22:45:52 95

原创 倒排索引是什么

我们打开NBA中国官⽹,搜索james得到以下结果:我们打开NBA中国官⽹,搜索james得到以下结果:假设⽂档集合如下图所示:1、 我们是怎么通过james查找到名字带有james的球员呢?2、 如果按照这个图,我们是不是得把这5个⽂档遍历⼀遍,把⽂档带有james的球员查找出来?3、如果按照这种顺序扫描,那每次输⼊不同的关键字,岂不是要从头到尾遍历⼀遍?假设⽂档集合如下图所示:1、我们把这个5个球员的名字进⾏分词,每个分词转成⼩写字⺟,并且以每个分词分组,...

2022-03-05 18:22:10 105

原创 传统复制与基于GTID复制

传统复制 复制拓扑的初始化配置和变更、复制的高可用切换等操作都需要找到正确的二进制日志文件和位置,否则就无法正确复制 每个从库都会记录当前对应主库的二进制日志文件位置、二进制日志文件名,以及在此文件中它已从主库读取和处理的位置(即SQL线程和I/O线程的位置)。每个从库独立地应用主库的二进制日志,相互之间不产生影响并各自记录自身应用到的位置,而且就算有从库与主库的连接发生断开或重连,也不会影响主库的操作 基于GTID的复制方式 定义:GTID(Global Transaction ..

2022-02-26 14:15:47 494

原创 Mysql的复制模式

复制功能之所以能够正常工作,是因为写入二进制日志的事件是从主库获取,然后在从库上回放的。根据事件的类型,事件以不同的格式被记录在二进制日志中,一般有三种复制模式,基于row复制模式,基于statement的复制模式以及mixed复制模式 什么是基于row的复制模式 使用row格式的二进制日志时,主库会将产生的事件(一组事件)写入二进制日志,以事件来表示数据的变更。将这些表示数据变更的事件复制到从库,然后在从库中应用这些事件,把主库数据同步到从库,这称为基于row(行)的复制,简称为RBR..

2022-02-25 10:18:57 532

原创 Mysql主从复制数据一致性校验方案

什么场景下会出现主从数据不一致1、本身复制延迟导致2、主库宕机或者从库宕机都会导致复制中断3、把一个从库提升为主库,可能导致从库和主库的数据不一致性主从一致性校验,如何实现 如果不一致你会怎么修复Mysql主从复制是基于binlog复制,难免出现复制数据不一致的风险,引起用户数据访问前后不一致的风险所以要定期开展主从复制数据一致性的校验并修复,避免这些问题解决方案之一,使用Percona公司下的工具pt-table-checksum工具进行一致性校验 原理: ..

2022-02-22 15:25:21 1250

原创 数据库主从同步遇到的问题

你们搭建数据库主从复制的目的有哪些容灾使用,用于故障切换业务需要,进行读写分离减少主库压力搭建了主从同步后会有同步延迟问题,为什么会有同步延迟问题,怎么解决?保证性能第一情况下,不能百分百解决主从同步延迟问题,只能增加缓解措施。现象:主从同步,大数据量场景下,会发现写入主库的数据,在从库没找到。原因: 1、主从复制是单线程操作,当主库TPS高,产生的超过从库sql线程...

2022-02-21 16:55:11 443

原创 消息队列常见问题之消息发生大量堆积应该怎么处理

线上故障了,怎么处理 消息堆积了10小时,有几千万条消息待处理,现在怎么办? 修复consumer, 然后慢慢消费?也需要几小时才可以消费完成,新的消息怎么办? 核心思想:紧急临时扩容,更快的速度去消费数据- 修复Consumer不消费问题,使其恢复正常消费,根据业务需要看是否要暂停- 临时topic队列扩容,并提高消费者能力,但是如果增加Consumer数量, 但是堆积的topic里面的message...

2022-02-19 10:25:44 1385

原创 JVM之垃圾收集器

serial垃圾收集器 是什么? 收集算法是内存收到的方法论,垃圾回收器是内存回收的具体实现。 Serial是一个单线程的垃圾收集器 serial垃圾收集器的特点 “Stop The World”,它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。在用户不可见的情况下把用户正常工作的线程全部停掉 使用场景:多用于桌面应用,Client端的垃圾回收器 桌面应用内存小,进行垃圾回收的时间比较短,只要不频繁发生停顿就可以接受。 parnew垃圾收集器 是什

2022-02-17 09:07:51 73

原创 JVM之垃圾收集器算法

1、引用计数法 优缺点 引用计数收集器可以很快的执行,交织在程序运行中。对程序需要不被长时间打断的实时环境比较有利。 无法检测出循环引用。如父对象有一个对子对象的引用,子对象反过来引用父对象。这样,他们的引用计数永远不可能为0. 2、可达性分析算法的概念(又叫跟搜索法) 根搜索算法是从离散数学中的图论引入的,程序把所有的引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,...

2022-02-16 09:49:58 97

原创 静态代理和动态代理

静态代理 什么是静态代理 由程序创建或特定工具自动生成源代码,在程序运行前,代理类的.class文件就已经存在 通过将目标类与代理类实现同一个接口,让代理类持有真实类对象,然后在代理类方法中调用真实类方法,在调用真实类方法的前后添加我们所需要的功能扩展代码来达到增强的目的 A -> B -> C 优点 代理使客户端不需要知道实现类是什么,怎么做的,而客户端只需知道代理即可 方便增加功能,拓展业务逻辑 缺点 代理类中..

2022-02-15 09:11:02 71

原创 Mybatis的多级缓存

Mybatis一级缓存 简介:一级缓存的作用域是SQLSession,同一个SqlSession中执行相同的SQL查询(相同的SQL和参数),第一次会去查询数据库并写在缓存中,第二次会直接从缓存中取 基于PerpetualCache 的 HashMap本地缓存,默认开启一级缓存 失效策略:当执行SQL时候两次查询中间发生了增删改的操作,即insert、update、delete等操作commit后会清空该SQLSession缓存; 比如sqlsession关闭,或者清空等 M...

2022-02-13 11:22:06 520

原创 并发编程之指令重排、happens-before

volatile可以避免指令重排:指令重排序分两类 编译器重排序和运行时重排序JVM在编译java代码或者CPU执行JVM字节码时,对现有的指令进行重新排序,主要目的是优化运行效率(不改变程序结果的前提)int a = 3 //1int b = 4 //2int c =5 //3 int h = a*b*c //4定义顺序 1,2,3,4计算顺序 1,3,2,4 和 2,1,3,4 结果都是一样虽然指令重排序可以提高执行效率,但是多线程上可能会

2022-02-08 09:05:41 76

原创 并发编程核心知识点volatile关键字

volatile是轻量级的synchronized,保证了共享变量的可见性,被volatile关键字修饰的变量,如果值发生了变化,其他线程立刻可见,避免出现脏读现象volatile:保证可见性,但是不能保证原子性synchronized:保证可见性,也保证原子性使用场景1、不能修饰写入操作依赖当前值的变量,比如num++、num=num+1,不是原子操作,肉眼看起来是,但是JVM字节码层面不止一步2、由于禁止了指令重排,所以JVM相关的优化没了,效率会偏弱 为什.

2022-02-04 19:07:00 192

原创 Kafka中的日志数据清理策略

Kafka将数据持久化到了硬盘上,为了控制磁盘容量,需要对过去的消息进行清理 Kafka日志删除策略 内部有个定时任务检测删除日志,默认是5分钟 log.retention.check.interval.ms 支持配置策略对数据清理 根据segment单位进行定期清理 启用cleaner log.cleaner.enable=true log.cleaner.threads = 2 (清理线程数配置) 日志删除 log.cleanup.policy=..

2022-02-01 17:16:02 742

原创 Kafka的高性能原理分析-ZeroCopy

零拷贝ZeroCopy(SendFile) 例子:将一个File读取并发送出去(Linux有两个上下文,内核态,用户态) File文件的经历了4次copy 调用read,将文件拷贝到了kernel内核态 CPU控制 kernel态的数据copy到用户态 调用write时,user态下的内容会copy到内核态的socket的buffer中 最后将内核态socket buffer的数据copy到网卡设备中传送 缺点:增加了上下文切换、浪费了2次无效拷贝(即

2022-01-30 17:27:44 81

原创 MQ之Kafka数据存储流程、原理、LEO+HW详解

Partition topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列 是以文件夹的形式存储在具体Broker本机上 LEO(LogEndOffset) 表示每个partition的log最后一条Message的位置。 HW(HighWatermark) 表示partition各个replicas数据间同步且一致的offset位置,即表示allreplicas已经commi...

2022-01-28 15:34:14 418

原创 读写锁ReentrantReadWriteLock详解

ReentrantReadWriteLock 1、读写锁接口ReadWriteLock接口的一个具体实现,实现了读写锁的分离, 2、支持公平和非公平,底层也是基于AQS实现 3、允许从写锁降级为读锁 流程:先获取写锁,然后获取读锁,最后释放写锁;但不能从读锁升级到写锁 4、重入:读锁后还可以获取读锁;获取了写锁之后既可以再次获取写锁又可以获取读锁 核心:读锁是共享的,写锁是独占的。 读和读之间不会互斥,读和写、写和读、写...

2022-01-27 15:07:28 702

原创 ReentrantLock和synchronized使用的场景是什么,实现机制有什么不同

ReentrantLock和synchronized都是独占锁synchronized: 1、是悲观锁会引起其他线程阻塞,java内置关键字, 2、无法判断是否获取锁的状态,锁可重入、不可中断、只能是非公平 3、加锁解锁的过程是隐式的,用户不用手动操作,优点是操作简单但显得不够灵活 4、一般并发场景使用足够、可以放在被递归执行的方法上,且不用担心线程最后能否正确释放锁 5、synchronized操作的应该是对象头中mark word,参.

2022-01-24 14:12:41 803

原创 分布式缓存之Redis

Redis的数据结构,这些结构的使用场景 String 简单的kv存储 hash 存储对象,一个key有多个值 list 列表型数据、消息队列等 set 无序集合、去重,交集、并集等,比如查看共同好友,在社交关系方面、数据排重等可以使用 sroted set 有序集合,去重,做榜单 Redis处理请求快的原因 redis是单线程,为什么这么快? 基于内存,绝大部分请求是纯粹的内存操作,CPU不是Redis的瓶颈 避免了不必要

2022-01-22 10:47:24 628

原创 进程、线程、协程,他们之间的关系是怎样的

进程: 本质上是一个独立执行的程序,进程是操作系统进行资源分配和调度的基本概念,操作系统进行资源分配和调度的一个独立单位线程:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程执行不同的任务,切换受系统控制。协程: 又称为微线程,是一种用户态的轻量级线程,协程不像线程和进程需要进行系统内核上的上下文切换,协程的上下文切换是由用户自己决定的,有自己的上下文,所以说是轻量级的线程,也称之为用户级别的线程就叫协程,一个线程可以多.

2022-01-19 15:40:19 464

原创 分布式事务的常⻅解决⽅案

常⻅分布式事务解决⽅案 2PC 和 3PC 两阶段提交, 基于XA协议 TCC Try、Confirm、Cancel 事务消息 最⼤努⼒通知型 分布式事务分类 刚性事务:遵循ACID 柔性事务:遵循BASE理论 分布式事务框架 TX-LCN:⽀持2PC、TCC等多种模...

2022-01-18 21:09:09 1935

原创 HashMap的底层实现,put、get流程

put核心流程:get核心流程:final Node<K,V> getNode(int hash, Object key) { Node<K,V>[] tab; Node<K,V> first, e; int n; K k; if ((tab = table) != null && (n = tab.length) > 0 && (first = tab...

2022-01-17 14:21:18 321

原创 HashMap的底层原理以及实现

HashMap底层是 数组+链表+红黑树,为什么要用这几类结构呢?数组 Node<K,V>[] table ,根据对象的key的hash值进行在数组里面是哪个节点 链表的作用是解决hash冲突,将hash值一样的对象存在一个链表放在hash值对应的槽位 红黑树 JDK8使用红黑树来替代超过8个节点的链表,主要是查询性能的提升,从原来的O(n)到O(logn), 通过hash碰撞,让HashMap不断产生碰撞,那么相同的key的位置的链表就会不断增长,当对这个Hashm

2022-01-16 17:25:28 73

原创 Collections.synchronizedList与CopyOnWriteArrayList的区别

CopyOnWriteArrayList:执行修改操作时,会拷贝一份新的数组进行操作(add、set、remove等),代价十分昂贵,在执行完修改后将原来集合指向新的集合来完成修改操作,源码里面用ReentrantLock可重入锁来保证不会有多个线程同时拷贝一份数组 场景:读高性能,适用读操作远远大于写操作的场景中使用(读的时候是不需要加锁的,直接获取,删除和增加是需要加锁的, 读多写少) Collections.synchronizedList:线程安全的原因是因为它几乎在每个方法中都使..

2022-01-15 17:47:10 616

原创 java多线程里面常用的锁

悲观锁:当线程去操作数据的时候,总认为别的线程会去修改数据,所以它每次拿数据的时候都会上锁,别的线程去拿数据的时候就会阻塞,比如synchronized。乐观锁:每次去拿数据的时候都认为别人不会修改,更新的时候会判断是别人是否回去更新数据,通过版本来判断,如果数据被修改了就拒绝更新,比如CAS是乐观锁,但严格来说并不是锁,通过原子性来保证数据的同步,比如说数据库的乐观锁,通过版本控制来实现,CAS不会保证线程同步,乐观的认为在数据更新期间没有其他线程影响。小结:悲观锁适合写操作多的场景,乐观锁.

2022-01-13 14:33:04 311

原创 mysql从数据执行到落盘步骤分析

Buffer Pool是什么?Buffer Pool就是数据库的一个内存组件,缓存了磁盘上的真实数据,我们的系统对数据库执行的增删改操作,其实主要就是对这个内存数据结构中的缓存数据执行的。

2022-01-12 16:00:28 637

原创 分布式 ID 生成算法Snowflake原理

什么是雪花算法Snowflake twitter用scala语言编写的高效生成唯一ID的算法 优点 生成的ID不重复 算法性能高 基于时间戳,基本保证有序递增 计算机的基础知识回顾 bit与byte bit(位):电脑中存储的最小单位,可以存储二进制中的0或1 byte(字节):一个byte由8个bit组成 常规64位系统里面java数据类型存储字节大小 int:4 个字节 short:2..

2021-12-27 15:16:02 82

空空如也

空空如也

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

TA关注的人

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