自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis 大Key删除策略

Redis 大Key删除策略问题背景一个 key 的 value 特别大,由于 Redis 是单线程模型,当对该 key 进行查询或者删除时,会造成 Redis 阻塞,阻塞期间所有的请求都有可能超时如何解决怎么发现大key1. String 类型可以使用命令 --bigkeys该命令对于 String 类型是统计的 value 的字节数,而对于 list 等类型是统计的元素的个数我们使用 --bigkeys 可以直观的判断出 String 的大key--bigkeys 是采用 scan

2022-05-18 19:55:01 856 1

原创 面试官:你实现过 AOP 吗?AOP的简单实现,现在奉上

手写 AOP1.0实现基于 CGLib实现动态代理JDK 动态代理需要被代理的类必须继承某一个接口基于ASM的CGLib,可以为被代理的类动态生成子类,以解决 JDK动态代理对接口的束缚实现 @Aspect、@Order 注解@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface Aspect { // 表示当前被 Aspect 标记的横切逻辑,会织入到被属性逻辑标记的那些

2022-05-04 21:47:01 648 1

原创 手写IOC容器

需要实现的点创建注解// 表示作用在类上@Target(ElementType.TYPE)// 可通过反射获取@Retention(RetentionPolicy.RUNTIME)public @interface Service {}提取标记对象指定范围,获取范围内的所有类遍历所有类,获取被注解标记的类,并加载入容器中实现容器保存 Class 对象及其载体可采用 ConcurrentHashMap容器加载配置的管理与获取获取指定范围内的 Clas

2022-04-29 11:47:58 163

原创 RocketMQ 事务消息原理

RocketMQ 事务消息原理依赖于 TransactionListener 接口实现executeLocalTransaction() 在发送消息后调用,用于执行本地事务,如果本地事务执行成功,RocketMQ 再提交消息Producer 发送消息给 MQ 后,MQ会回调这个方法,开发者在该方法中编写事务逻辑,执行成功后 MQ 会将消息提交checkLocalTransaction() 用于检查事务是否执行成功,RocketMQ 依赖此方法做补偿通过内部的两个 Topic 来实现

2022-04-05 15:34:16 648

原创 RocketMQ 如何实现顺序消息

如何实现顺序消息默认无法保证顺序消息需要程序保证发送和消费的是同一个 Queue(多线程消费也无法保证)生产者: 发送端保证发往一个固定的 queue ,生产者可以在消息体设置消息的顺序。可以选择 实现 MessageQueueSelector 选择一个 Queue 进行发送也可以选择 RocketMQ 的默认实现SelectMessageQueueByHash:按参数的 HashCode 与可选队列进行求余选择producer.send(msg,new SelectMessa

2022-04-05 15:24:37 2066

原创 RocketMQ 的消息持久化机制

RocketMQ 持久化机制RocketMQ 的消息持久化主要依靠以下文件完成CommitLog日志数据文件,存储消息内容,所有 queue 共享,不区分 topic ,顺序读写 ,1G 一个文件ConsumeQueue逻辑 Queue,基于 topic 的 CommitLog 的索引文件消息先到达 commitLog,然后异步转发到 consumeQueue,包含 queue 在 commitLog 中的物理偏移量 offset,消息实体内容大小和 Message Tag 的 hash

2022-04-05 15:22:27 2516

原创 利用反射实现 Map 与 JavaBean 的相互转换

package demo;import java.lang.reflect.Field;import java.lang.reflect.Modifier;import java.util.HashMap;import java.util.Map;/** * 利用反射实现 * Map 与 JavaBean 的相互转换 */public class ConvertUtil { /** * map 转 JavaBean * * @param map

2022-04-03 16:05:32 331

原创 Java 面试之 ConcurrentHashMap

Java 面试之 ConcurrentHashMapConcurrentHashMap数据结构负载因子hashsizeCtl 字段sizeCtl == -1sizeCtl > 0 并且散列表已经初始化完毕sizeCtl < 0 && sizeCtl != -1扩容标识戳的计算方式低十六位如何保证线程安全hash 寻址算法ConcurrentHashMap 如何统计当前散列表的数据量ConcurrentHashMap 为什么不采用 AtomicLong 统计数量LongAdder的

2022-03-28 16:36:45 1243

原创 Java 中的线程同步方案

Java 中的线程同步方案|线程安全的实现方法同步是指在多个线程并发访问共享数据时保证共享数据在同一时刻只被一条线程使用。1. 互斥同步即阻塞同步临界区、互斥量、信号量都是常见的互斥实现方式。在 Java 中,最基本的同步方式就是 synchronized 关键字被 synchronized 修饰的同步块对同一条线程来说是可重入的。这意味着同一线程反复进入同步块也不会出现自己把自己锁死的情况被 synchronized 修饰的同步块在持有锁的线程执行完毕并释放锁之前,会无条件的阻塞后面其他

2022-03-21 21:08:29 527

原创 HTTP 的缓存机制

缓存分为两种:强缓存和协商缓存

2022-03-19 21:43:00 307

原创 偏向锁、轻量级锁、重量级锁加锁过程即锁升级膨胀过程

偏向锁、轻量级锁、重量级锁加锁过程即锁升级膨胀过程synchronized偏向锁为什么要引入偏向锁偏向锁加锁过程线程获取到锁对象的偏向锁之后,执行完同步代码块之后,会释放这个偏向锁吗使用了偏向锁就一定会提升性能吗轻量级锁为什么要引入轻量级锁轻量级锁的加锁过程(从无锁状态)锁重入轻量级锁释放轻量级锁与偏向锁之间的区别偏向锁升级到轻量级锁的过程重量级锁重量级锁内部的主要数据结构线程获取锁的流程重量级锁的释放线程唤醒策略重量级锁是公平锁吗锁膨胀成重量级锁的过程synchronized偏向锁为什么要引入偏向锁

2022-03-15 10:06:28 1611 2

原创 InnoDB 为什么选择 B+ 树索引

InnoDB 为什么选择 B+ 树索引首先在执行效率方面,我们希望查询效率尽可能的高、速度尽可能的快、存储空间方面我们希望他所需的空间尽可能的小哈希表哈希表查询的时间复杂度是 O(1),但是哈希表不支持区间的查询方式哈希索引的哈希值存储是无序的,哈希索引不能进行范围的查找,也不能进行排序的操作平衡二叉树随着二叉树高度的增加,二叉树查找的速度会越来越慢并且平衡二叉树也不支持快速的范围查找B 树B 树相对于平衡二叉树解决了树的高度的问题,但是依旧不能支持范围查找,在进行范围查找时需要进行回旋查找

2022-03-12 17:12:25 583

原创 Java 类加载器

JVM 类加载器类加载器类加载器种类双亲委派模型双亲委派模型要求工作过程双亲委派模型的优点什么情况下会破坏双亲委派模型类加载器作用:用于实现类的加载动作即将字节码文件从 JVM 外部加载到内存中用于确定类的唯一性提供隔离特性,为中间件开发者提供便利类加载器种类Bootstrap Class Loader(启动类加载器)最顶层的加载器,由 C++ 实现,负责加载 %JAVA_HOME%\lib 目录下的 或者是被 -Xbootclasspath参数所指定的路径存放的类库Ext

2022-03-12 10:52:19 481

原创 类加载过程

类加载过程类的加载过程详情类的生命周期类的加载过程加载验证文件格式验证元数据验证字节码验证符号引用验证准备解析符号引用直接引用初始化`()` 方法是如何产生的在什么情况下必须对类进行初始化卸载类的加载过程详情类的生命周期加载 —>连接 (验证 —> 准备 —> 解析)—> 初始化 —>使用 —>卸载类的加载过程Class 文件需要加载到虚拟机中之后才能够运行和使用类加载的全过程:加载、验证、准备、解析、初始化加载在加载阶段虚拟机需要完成一下三件事:通过

2022-03-10 18:15:11 239

原创 Java 对象的创建过程、内存布局以及访问定位

类加载检查 --->内存分配 --->初始化零值 ---> 设置对象头 ---> 执行 init() 方法

2022-03-08 16:32:06 341

原创 Java 内存区域

Java的内存区域Java 内存区域运行时数据区域程序计数器Java 虚拟机栈局部变量表Java 虚拟机栈的两类异常情况本地方法栈堆方法区方法区和永久代关系为什么会将永久代替换为元空间运行时常量池直接内存Java 内存区域运行时数据区域线程私有程序计数器虚拟机栈本地方法栈线程共享堆方法区程序计数器程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循

2022-03-08 14:01:10 649

原创 Java 虚拟机的垃圾回收机制

Java 虚拟机的垃圾回收机制JVM的垃圾回收如何判断对象已死可作为 GC Roots 的对象:引用引用队列回收方法区常量的回收不再使用的类型的回收垃圾回收算法标记清除算法标记复制算法标记整理算法关于是否移动对象JVM的垃圾回收如何判断对象已死共有两种方法:引用计数算法在对象中添加一个引用计数器,当有地方引用它时,计数器加一;引用失效时,计数器就减一;任何时候计数器为零的对象就是不可能再被使用的优点:实现简单,效率高缺点:单纯的引用计数很难解决对象之间相互引用的问题当两个对象相互引用时

2022-03-01 20:19:47 475

原创 基于Redis的分布式锁

分布式锁使用分布式锁的原因分布式锁是保证分布式系统之间同步访问共享资源的一种方式注意事项在获取锁时,使用 SET name value NX EX Time 保证获取锁时的原子性,以及宕机时锁自动释放在释放锁时,运行以下脚本,避免释放其他线程的锁// 释放锁 比较value是否相等 避免误释放if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1])else return 0e

2022-02-14 10:21:03 370

原创 Redis的基本数据结构

Redis的基本数据结构数据结构string(字符串)Redis的字符串是动态字符串,是可以修改的字符串,内部结构类似Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配当字符串长度小于1M时,成倍扩容,超过1M每次扩容1M,最大长度为512M可用于缓存用户信息list(列表)Redis中的list相当于Java的LinkedList,插入和删除为 O(1) ,索引定位很慢,时间复杂度为 O(n)list结构可用作异步队列,将需要延后处理的任务结构体序列化

2022-02-13 20:30:53 635

原创 MySQL的存储引擎

存储引擎InnoDB存储引擎支持事务,引入了行锁设计并且支持外键将数据放在一共逻辑的表空间中,从MySQL4.1开始,InnoDB存储1引擎的表单存放到一共独立的ibd文件中,默认为可重复读隔离级别MyISAM存储引擎不支持事务也不支持外键,支持全文索引,MyISAM的缓存池知缓存索引文件,而不缓存数据文件MyISAM存储引擎表由MYD和MYI组成MYD用来存放数据文件,MYI用来存放索引文件Memory存储引擎将表中的数据全部存放在内存中,如果数据库重启或发生崩溃,表中的数据

2022-02-12 22:50:35 451

原创 MySQL关于ACID的原理以及相关问题

MySQL关于ACID的原理以及相关问题事务事务的特性InnoDB如何实现ACID事务事务的特性原子性 A整个数据库事务都是不可分割的工作单位,只有使事务中的所有数据库操作都执行成功,事务才算成功一致性 C一致性是指事务使数据库从一种状态转移到下一种一致性状态,事务的执行之前和执行之后都必须处于一致性状态隔离性 I事务隔离性要求每个事务的读写对象对其他事务的操作对象能相互分离,即在提交之前对其他事务都不可见持久性 D事务一旦提交结果就是永久性的,即使数据库发

2022-02-12 17:38:32 662

原创 计算机网络笔记

计算机网络复习计算机网络什么是协议分组交换分组交换网络服务和协议的关系五层七层协议应用层什么是socket(TCP)UDP中的socketHTTPHTTP1.0HTTP1.1CookiesFTP (文件传输协议)EmailSMTP协议(25端口)邮件访问协议DNS运行过程P2PDHCP工作过程传输层TCP(提供可靠的字节流的服务)UDP(提供不可靠的数据报的服务)UDP校验和多路复用解复用可靠数据传输(RDT)原理滑动窗口协议TCP流量控制拥塞控制方法TCP的拥塞控制TCP连接建立连接的目的三报文握手四次报

2022-01-06 22:46:23 134

原创 RocketMQ消息生产过程以及Queue选择算法

RocketMQ消息生产消息生产的过程获取Producer发送消息之前会先向NameServer发送获取该消息Topic的路由信息的请求NameServer返回该Topic的路由表以及Broker列表Producer根据代码中指定的Queue选择策略,从Queue列表中选出一个队列,用于后续存储消息Produer对消息做一些特殊处理,例如,消息本身超过4M,则会对其进行压缩Producer向选择出的Queue所在的Broker发出RPC请求,将消息发送到选择出的Queue

2021-12-23 19:53:13 637

原创 Java swing编程 校园导航系统

数据结构课程设计主要是迪杰斯特拉算法好久好久好久之前写的了,那时候还啥也不会,代码也有很多问题,把垃圾代码分享出来纪念一下吧。代码在github上 https://github.com/zunchang/Java-Swing-Navigation/tree/master...

2021-12-20 15:48:43 1130 7

原创 MySQL实战45讲 学习笔记(七)

MySQL学习笔记count(*) 速度问题提高count性能用缓存系统保存计数在数据库中计数不同count用法count(*) 速度问题MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count() 的时候会直接返回这个数InnoDB 引擎执行 count() 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数innodb由于多版本并发控制(MVCC)的原因,多个事务count的行数不同,所以不能保存总行数。但count(*)做了优化,引擎会选择最小的普通索引树,来计数。而不

2021-10-17 20:29:31 51

原创 MySQL实战45讲 学习笔记(六)

MySQL学习笔记MySQL性能瞬间下降分析什么时候会引发flush显然:以下两种情况会严重影响性能:flush速度控制影响InnoDB的刷盘速度的因素:相关参数表内数据的删除表结构表数据innodb_file_per_table表数据删除与复用删除数据插入数据更新数据如何解决这种空洞重建表optimize table、analyze table 和 alter table 这三种方式重建表的区别MySQL性能瞬间下降分析什么时候会引发flushredo log 写满。这时候系统会停止所有更新操作,

2021-10-17 15:33:00 115

原创 MySQL实战45讲 学习笔记(五)

MySQL优化器的索引选择与字符串索引优化器的逻辑扫描行数怎么判断索引选择异常处理为长字符串加索引使用hash索引和倒序异同优化器的逻辑扫描行数的多少是否使用临时表是否排序扫描行数怎么判断MySQL在开始统计之前并不能精确的知道满足这个条件的记录有多少条,只能根据**索引的“区分度”**来估算记录数MySQL通过采样统计一个索引上的不同值的个数来统计区分度,不同值的个数越多,索引的区分度越好索引选择异常处理对于由于索引统计信息不准确导致的问题 analyze table t 命令,可

2021-10-17 11:22:51 66

原创 MySQL实战45讲 学习笔记(四)

锁全局锁使用场景:readonly缺点表级锁表锁使用MDL使用注意如何安全的给小表加字段行锁两段锁协议死锁和死锁检测出现死锁以后策略主动死锁检测缺点 :消耗大量的CPU资源解决策略:全局锁对整个数据库实例加锁Flush tables with read lock(FTWRL)加全局读锁使用场景:全库逻辑备份可重复读隔离级别下,可使用 逻辑备份工具:mysqldump当 mysqldump 使用参数–single-transaction的时候,导数据之前就会启动一个事务,来确保拿到一致性视图也

2021-10-14 21:24:16 87

原创 MySQL实战45讲学习笔记(三)

MySQL的事务与索引事务特性事务的启动方式:长事务的危害索引索引分类索引类型:普通索引和主键索引的区别页的内部原理页分裂页合并覆盖索引最左前缀原则索引下推事务特性原子性一致性隔离性持久性事务的启动方式:显式的启动:begin或 start transaction。提交语句为commit,回滚事务语句是rollbackset autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一 个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存

2021-10-04 22:55:33 135

原创 MySQL实战45讲 学习笔记(二)

MySQL的日志系统redo log(重做日志)作用:结构:binlog(归档日志)binlog和 redo log的区别执行一条更新语句的执行顺序redo log(重做日志)redo log为InnoDB特有的日志作用:用于记录事务操作的变化,记录的是数据修改之后的值。在MySQL宕机时,InnoDB通过redo log恢复数据,保证数据的完整性。即 保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe在一条记录更新的时候,InnoDB引擎会先把记录写入redo

2021-10-04 16:42:41 79

原创 MySQL实战45讲 学习笔记(一)

MySQL高级部分MySQL 基础架构什么是长链接?什么是短连接?如何选择?解决方案注意:一条查询语句的执行过程:MySQL 基础架构MySQL可以分为server层和存储引擎两个部分server包括 连接器(管理连接,权限验证)、查询缓存(命中直接返回结果)、分析器(词法分析,语法分析)、优化器(执行计划生成,索引选择)、执行器(操作引擎,返回结果)存储引擎(存储数据,提供读写接口)什么是长链接?长链接是连接成功后,如果客户端持续有请求,则一直使用同一个连接。什么是短连接?短连接是指每次执

2021-10-04 15:42:13 58

原创 多线程通信之ThreadLocal

ThreadLocal详解ThreadLocal作用应用场景运行过程优点ThreadLocal原理:initialValue()get()ThreadLocalMap类ThreadLocalMap中的value泄露如何避免 内存泄露ThreadLocal注意点ThreadLocal作用使线程中的某个值,与保存值的对象关联起来。通常用于防止可变的单实例变量或全局变量进行共享应用场景每个线程需要一个共享的对象(通常是工具类)每个线程内需要保存全局变量运行过程在ThreadLocal第一次调用g

2021-09-06 17:22:50 227

原创 Java中的线程池

Java中的线程池为什么使用线程池?使用线程池的优点:线程池的创建:参数意义:巧妙设置参数工作队列Executor框架线程池中的线程数目设定为多少比较合适?线程池状态线程池的操作拒绝任务拒绝时机拒绝策略线程池的组成部分使用线程池的注意点为什么使用线程池?反复创建线程开销较大过多的线程会占用太多的内存使用线程池的优点:降低资源消耗(重复利用已创建的线程)提高响应速度集中控制线程池的创建:new ThreadPoolExecutor(corePoolSize,maximumPoolSi

2021-09-06 16:02:13 224

原创 Java内存模型

​什么是Java内存模型?Java内存模型简称JMM,是一组规范,需要各个JVM的实现来遵守JMM规范,以便于开发者可以利用这些规范,方便的开发多线程程序。Java线程之间的通信由JMM控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。重排序:重排序分为3种类型:编译器优化的重排序CPU指令重排内存系统的重排序重排序可能会导致多线程程序出现内存可见性问题可见性:为什么会有可见性问题?JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存中,每个线程都有一个私

2021-08-23 20:51:57 67

原创 Java多线程部分(基础八股)

Java多线程部分 基础知识实现多线程的方法(3种):区别:一个线程两次调用start()方法会怎样?start方法的含义:start方法的启动过程:如何正确的停止线程?注意:在while中使用try/catch,会导致中断失败如何处理不可中断的阻塞?线程的生命状态:为什么wait()需要在同步代码块中使用,而sleep()不需要?wait和sleep方法的异同为什么wait.notify和notifyAll被定义在Object类里,而sleep定义在Thread类里?join方法yield方法守护线程和普

2021-08-20 21:43:44 197

空空如也

空空如也

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

TA关注的人

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