自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 redolog和binlog的两阶段提交和区别

如果MySQL宕机了,重启后,就需要检查redolog 日志文件里面,系统会自动定位到上次checkpoint的位置,同时,每个数据页中也存在一个LSN,当redo log中的LSN大于数据页中的LSN时,说明重启前redo log中的数据未完全写入数据页中,那么将从数据页中记录的LSN开始,从redo log中恢复数据。由此可见,如果不使用两阶段提交,那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致。和 redolog两份日志最终恢复到数据库的数据是一致的,采用两阶段提交的机制。

2024-08-06 21:31:56 803

原创 ​@Transactional注解哪些场景下会失效​

如果当前不存在事务,则抛出异常。( 当类A中的 a 方法用默认Propagation.REQUIRED模式,类B中的 b方法加上采用 Propagation.REQUIRES_NEW模式,然后在 a 方法中调用 b方法操作数据库,然而 a方法抛出异常后,b方法并没有进行回滚,因为Propagation.REQUIRES_NEW会暂停 a方法的事务 )Propagation.NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,暂停当前的事务。则外部调用方法A之后,方法B的事务是不会起作用的。

2024-07-24 21:13:18 644

原创 canal+mq将数据同步到redis中的一些类型转换问题

在将 Canal 捕获到的数据库变更同步到 RabbitMQ 时,通常需要将变更事件的数据从 Java 对象转换为一种通用的数据格式,如 JSON。这样可以确保数据在不同系统之间传递时的兼容性。以下是将 Canal 数据同步到 RabbitMQ 并进行数据类型转换的示例代码。

2024-07-02 15:00:45 557

原创 Canal+MQ监听MySQL数据

canal 翻译为管道,主要用途是基于 MySQL 数据库的增量日志 Binlog 解析,提供增量数据订阅和消费。早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。基于日志增量订阅和消费的业务包括数据库镜像;数据库实时备份;索引构建和实时维护(拆分异构索引、倒排索引等);业务 cache 刷新;

2024-07-02 14:54:45 1138

转载 详解一致性哈希算法

一致性哈希算法也是使用取模的方法,但是取模算法是对服务器的数量进行取模,而一致性哈希算法是对 2^32 取模,具体步骤如下:步骤一:一致性哈希算法将整个哈希值空间按照顺时针方向组织成一个虚拟的圆环,称为 Hash 环;步骤二:接着将各个服务器使用 Hash 函数进行哈希,具体可以选择服务器的IP或主机名作为关键字进行哈希,从而确定每台机器在哈希环上的位置。

2024-06-17 16:35:45 109

原创 Linux常用指令

查找文件和目录,用于在目录中查找符合条件的文件和目录。: 显示文件的开头部分,默认显示前10行。: 显示文件的末尾部分,默认显示后10行。- 创建链接,用于创建硬链接或符号链接(软链接)。: 输出字符串到终端,可以用来显示文本或变量的值。: 清屏,清除终端显示内容,使终端显示变得干净。- 文本处理工具,用于根据模式匹配和处理文本。: 创建一个空文件,或更新现有文件的修改时间。- 归档文件,用于创建和解开tar归档文件。- 剪切文件,用于提取文本行中的某些部分。- 搜索文本,用于在文件中搜索匹配的文本。

2024-06-06 16:49:14 181

原创 redis的分布式锁

(3)为了有效解决既保证锁完全有效性 和 性能高效问题:antirez又提出了“延迟重启”的概念,redis同步到磁盘方式保持默认的每秒1次,在redis崩溃单机后(无论是一个还是所有),先不立即重启它,而是等待TTL时间后再重启,这样的话,这个节点在重启前所参与的锁都会过期,它在重启后就不会对现有的锁造成影响,缺点是在TTL时间内服务相当于暂停状态;(3)存在多个线程同时持有锁的情况:如果线程A执行任务的时间超过锁的过期时间,这时另一个线程就可以获得这个锁了,造成多个线程同时持有锁的情况。

2024-06-03 17:55:01 901

原创 详解布隆过滤器,实现分布式布隆过滤器

原理布隆过滤器是一种基于位数组(bit array)和多个哈希函数的数据结构。初始化一个长度为m的位数组,所有位初始化为0。使用k个不同的哈希函数将元素映射到位数组中的k个位置。当插入一个元素时,使用k个哈希函数计算该元素的k个哈希值,并将位数组中对应位置的值设为1。当查询一个元素是否存在时,使用同样的k个哈希函数计算该元素的k个哈希值,并检查位数组中对应位置的值是否都为1。如果有一个位置的值为0,则该元素肯定不在集合中;如果所有位置的值都为1,则该元素可能在集合中。

2024-06-03 17:28:29 1571

原创 什么是Redis脑裂,如何解决呢

Redis 脑裂问题是指,在 Redis 哨兵模式或集群模式中,由于网络原因,导致主节点(Master)与哨兵(Sentinel)和从节点(Slave)的通讯中断,此时哨兵就会误以为主节点已宕机,就会在从节点中选举出一个新的主节点,此时 Redis 的集群中就出现了两个主节点的问题,就是 Redis 脑裂问题。

2024-05-29 09:31:34 936

原创 谈谈反射,其原理?

总的来说,Java反射机制是基于Java虚拟机的运行时数据区和Java类文件的结构实现的,通过反射可以在运行时动态地获取类的信息、构造对象、调用方法等操作,具有很高的灵活性和扩展性。动态调用方法:通过反射可以动态地调用类的方法,包括公有方法、私有方法以及静态方法,可以在运行时根据需要动态地选择调用哪个方法。运行时类型检查:通过反射可以获取类的信息,包括类名、父类、实现的接口等,从而在运行时对对象的类型进行检查。Java类文件的结构:Java类文件包含了类的结构信息,包括类的名称、字段、方法、构造器等。

2024-04-19 18:00:45 575 1

原创 Java基础:equals 与==区别,final,finally,finalize的区别,重写和重载的区别

在Java中,对象的hashCode()方法用于返回对象的哈希码,而equals()方法用于比较两个对象是否相等。根据Java规范,如果两个对象通过equals()方法被判定为相等,则它们的hashCode()方法应该返回相同的值,但是反过来并不一定成立。由于哈希函数的映射空间通常远远小于对象的实际取值范围,所以会出现不同的对象映射到相同的哈希码的情况。在Java中,重写equals方法的同时,也需要重写hashCode方法,以确保对象在相等时具有相同的哈希码。==:比较的是变量的值或引用的地址值。

2024-04-19 14:05:46 417 1

原创 谈谈创建对象和类的加载过程

在 Java 中,创建对象和类的加载是两个密切相关但又相对独立的过程。下面详细解释这两个过程。

2024-04-02 18:21:27 437 1

原创 String、StringBuffer、StringBuilder的区别

使用String当字符串操作简单或者不频繁修改字符串时。使用在需要线程安全的字符串操作场景中。使用在单线程中进行频繁的字符串修改操作,或者在多线程环境中,可以确保字符串只在单个线程中被修改时。

2024-04-02 18:17:49 383 1

原创 分布式限流——Redis实现令牌桶算法

2. **原子操作**:Redis提供了一系列操作哈希的原子命令,例如`HSET`, `HGET`, `HMSET`, `HMGET`等。- **Key(键)**:`"token_bucket:/api/action"`(这个键唯一标识了`/api/action`这个API的令牌桶)- **Value**:对于每个键(即每个令牌桶),其值是一个包含`last_fill_time`和`tokens`字段的哈希结构。2. **请求到达时**:计算自上次填充以来应该新增的令牌数,并更新令牌桶的容量。

2024-04-01 23:26:47 3986

原创 谈谈JVM垃圾回收

在Java虚拟机(JVM)中,判断对象是否已经“死亡”,即不再被任何线程访问的状态,是垃圾回收(GC)过程中的关键步骤。JVM采用两种主要方法来判定对象是否可回收:可达性分析(Reachability Analysis)和引用计数(Reference Counting)。主流的Java虚拟机实现,如HotSpot,主要使用可达性分析来判断对象是否存活。

2024-04-01 18:01:57 798

原创 谈谈JVM的内存区域

JVM(Java虚拟机)是运行所有Java应用程序的假想计算机。它是Java运行时环境的一部分,为Java应用程序提供了跨平台执行的能力。JVM主要负责两件事情:一是加载编译后的Java字节码到其运行时环境中,二是执行这些字节码。JVM在执行字节码时,会进行解释执行或JIT(即时编译)执行,以提高程序运行效率。类加载器(Class Loader):JVM的类加载器负责加载Java应用程序的类。这一过程分为加载、链接(验证、准备和解析)、和初始化三个主要阶段。

2024-04-01 16:40:21 705

原创 详解hashmap

Hash 值的范围值比较大,使用之前需要先对数组的长度取模运算,得到的余数才是元素存放的位置也就是对应的数组下标。这个数组下标的计算方法是。将HashMap的长度定为2 的幂次方,这样就可以使用位运算代替%取余的操作,提高性能。先看下HashMap的默认构造函数:// 容纳键值对的最大值// 负载因子int size;

2024-03-12 23:39:22 1057 1

原创 java集合有哪些?有什么区别?

List代表了有序可重复集合,可直接根据元素的索引来访问;Set代表无序不可重复集合,只能根据元素本身来访问;Queue是队列集合。Map代表的是存储key-value对的集合,可根据元素的key来访问value。派生出来的,Collection有三个子接口:List、Set、Queue。Java集合类主要由两个接口。集合体系中常用的实现类有。

2024-03-12 23:27:33 374 1

原创 谈谈Arraylist?

ArrayList 的底层是动态数组,它的容量能动态增长。在添加大量元素前,应用可以使用ensureCapacity操作增加 ArrayList 实例的容量。ArrayList 继承了 AbstractList ,并实现了 List 接口。

2024-03-12 23:24:09 980 1

原创 什么是JMM?

这个简单,整个Java内存模型实际上是围绕着三个特征建立起来的。原子性,可见性,有序性。这三个特征可谓是整个Java并发的基础。

2024-03-11 23:22:52 844 1

原创 谈谈ThreadLocal

ThreadLocal实现每一个线程自己的专属本地变量,该变量是当前线程独有的变量。ThreadLocal 可以在每个线程中创建一个独立的变量堆栈,使得每个线程中的变量都是相互独立的。这使得 ThreadLocal 可以被用于实现多线程的并发编程,例如在多线程的 Java 应用程序中,不同线程之间的变量不会互相干扰,从而提高了程序的性能和可靠性。

2024-03-10 21:25:33 404 1

原创 谈谈volatile

内存屏障(Memory Barrier 或 Memory Fence)是一种硬件级别的同步操作,它强制处理器按照特定顺序执行内存访问操作,确保内存操作的顺序性,阻止编译器和 CPU 对内存操作进行不必要的重排序。内存屏障可以确保跨越屏障的读写操作不会交叉进行,以此维持程序的内存一致性模型。在 Java 内存模型(JMM)中,volatile 关键字用于修饰变量时,能够保证该变量的可见性和有序性。

2024-03-09 10:52:57 969

原创 创建线程方法?什么是线程池?线程池原理?线程池的线程复用?(由浅入深,全面剖析)

创建一个多线程需要执行两个步骤,继承Thread类,创建一个新的线程类,比如命名为mythread类,重写run()方法,将需要并发执行的业务代码编写在run()方法中,那么启动线程的话,我们创建mythread类, 调用mythread.start()来启动线程就可以了。线程的复用是通过while循环实现的,worker会首先获取当前的firstTask进行run,然后不停的循环从等待队列中获取新的任务task,如果有新任务则直接调用task的run方法,不会再去新建一个线程,从而实现复用。

2024-03-07 23:20:44 853 1

原创 谈谈双亲委派机制?

双亲委派机制是Java进行类加载的一种机制,意思是classloader类通过委托父类加载器来搜索类和资源那么双亲委派机制的流程是什么?首先,当类加载器接受到加载请求时,他先判断该类是否被加载过,如果加载则直接返回,如果没有加载过则尝试加载类加载器在加载类时,不会自己尝试去加载该类,而且调用父加载器的loadclass()方法去加载类,即委托父类去加载,如此递归,所有请求会传到最顶层的启动类加载器BootstrapClassloader当父类加载器反馈自己无法加载这个请求时,然后子加载器才会

2024-03-07 12:39:54 327 1

原创 谈谈synchronized

synchronized的锁升级机制?先说锁的升级过程。

2024-03-07 03:40:04 335 1

原创 谈谈cas

cas的底层就是一条cmpxchg指令,当使用该指令时,操作系统就会锁住总线,避免其他cpu调用(这里涉及计组的知识,可以搜索cpu总线和三级缓存了解),那这个指令是谁提供的呢,unsafe类提供了cas操作,这个操作方法是用native修饰的,说明这个是本地方法,交给本地代码,也就是说这个方法是c++写的,不是java写的,那就是说明这个方法是操作系统提供的(这里就能解释为什么cas是基于操作系统的一条指令啦),所以,cmpxchg指令就是在这个native方法里运行的。

2024-03-06 21:08:26 390

原创 谈谈线程安全的集合concurrenthashmap

那么,jdk1.8后,他是用node数组+CAS+synchronized来保证线程安全,他是怎么保证的呢,查看源码我们知道,首先put的时候,要先通过hash函数计算数据要插入到数组的哪个地方,如果数组桶(指改数组上还没有链表或红黑树)为空,那就通过cas+自旋的方式放入数据,如果桶里有数据了呢,首先判断是否需要扩容,然后再使用synchronized锁锁住首节点,然后将数据插入,当然如果插入时发现数组长度>64,链表长度>8,那链表要换成红黑树哦,数据就是加入红黑树里啦。

2024-03-06 20:19:23 531

原创 谈谈对AQS的理解

抽象队列同步器,

2024-03-05 20:30:07 417 1

空空如也

空空如也

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

TA关注的人

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