自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

迪曼奥特迦-博客

越努力,越幸运。

  • 博客(99)
  • 资源 (1)
  • 收藏
  • 关注

转载 【SpringBoot】一文详解 Spring Bean 循环依赖

循环依赖是指 Bean 对象循环引用,是两个或多个Bean之间相互持有对方的引用。循环依赖有2种表现形式:第一种是相互依赖,也就是A依赖B,B又依赖A:第二种是自我依赖,也就是A依赖自己形成自我依赖:对象引用循环依赖在某些业务场景上可能是合理存在的,但是由于 Spring 容器设计了依赖注入机制,即Spring 容器在创建 bean 实例化以后就要给 bean 中的属性自动赋值,要全部自动赋值之后,才能交给用户使用。

2023-11-25 14:59:19 493 1

原创 【Java】Java 17 新特性概览

Java 11 于 2021年09月14日 正式发布,且为长期支持版本(Long-Term-Support - LTS)。。下面为 Oracle Java SE 产品的一些关键产品日期示例(

2023-10-22 10:08:03 8899 12

原创 【Java】Java 11 新特性概览

Java 11 于 2018 年 9 月 25 日正式发布,且为长期支持版本(Long-Term-Support - LTS)。下面为 Oracle Java SE 产品的一些关键产品日期示例(

2023-10-20 22:47:46 2751 18

原创 【Java】HashMap 详解(背诵版)

哈希表(Hash Table)是一种常见的数据结构,也被称为散列表。它通过使用哈希函数将键映射到存储桶中,以实现高效的键值对存储和查找操作。哈希表的基本原理是,通过将键(key)作为输入,经过哈希函数的计算,得到一个对应的哈希码(hash code)。这个哈希码通常是一个整数,用于确定键在哈希表中的存储位置。哈希表内部由一个数组(数组的每个元素称为桶)和哈希函数组成。当需要存储一个键值对时,哈希函数计算出键的哈希码,并将其映射到对应的桶中。

2023-10-06 15:11:17 171

原创 【Java 并发编程】CopyOnWriterArrayList 详解

CopyOnWriteArrayList 体现了写时复制的思想,增删改操作都是在复制的新数组中进行的;CopyOnWriteArrayList 的取值方法是弱一致性的,无法确保实时取到最新的数据;CopyOnWriteArrayList 的增删改方法通过可重入锁确保线程安全;CopyOnWriteArrayList 线程安全体现在多线程增删改不会抛出异常,并不能确保数据的强一致性;

2023-09-22 10:42:47 316 4

原创 【Java 并发编程】读写锁 ReentrantReadWriteLock & StampLock 详解

读写锁 ReadWriteLock,顾名思义一把锁分为读与写两部分,读锁允许多个线程同时获得,因为读操作本身是线程安全的。而写锁是互斥锁,不允许多个线程同时获得写锁。并且读与写操作也是互斥的。读写锁适合多读少写的业务场景。针对读多写少场景,Java 的并发包提供了读写锁 ReentrantReadWriteLock,整体架构和实现都与 ​​ReentrantLock​​​ 类似,不同之处在于​​ ReentrantReadWriteLock ​​​分为读锁和写锁,读锁是共享锁,可多个读线程共享一把锁;

2023-07-22 17:08:15 355

转载 【Java 并发编程】Java 线程池实现原理及其在业务中的实践

线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。而本文描述线程池是JDK中提供的ThreadPoolExecutor类。降低资源消耗。

2023-07-13 15:37:21 256 1

原创 【Java 并发编程】深入理解 AQS - ReentrantLock 源码分析

AQS,全名 AbstractQueuedSynchronizer,是一个抽象同步队列,它的内部通过维护一个状态 volatile int state(共享资源的状态),一个 FIFO 线程等待队列来实现同步功能。Java 并发包很多工具类底层都是基于 AQS 来实现的,比如:Lock 工具 ReentrantLock、栅栏 CountDownLatch、信号量 Semaphore 等。

2023-05-30 23:15:01 648 1

原创 【Java 并发编程】CAS 原理解析

悲观锁的原理是每次实现数据库的增删改的时候都进⾏阻塞,防⽌数据发⽣脏读。乐观锁的原理是在数据库更新的时候,⽤⼀个 version 字段来记录版本号,然后通过⽐较是不是⾃⼰要修改的版本号再进⾏修改。这其中就引出了⼀种⽐较交换的思路来实现数据的⼀致性,事实上,CAS 也是基于这样的原理。

2023-05-18 14:14:49 1079 20

原创 【Java 并发编程】Java 线程本地变量 ThreadLocal 详解

先一起看一下 ThreadLocal 类的官方解释:用大白话翻译过来,大体的意思是:ThreadLoal 提供给了线程局部变量。同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。这里有几点需要注意:因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread 使用。这是也是 ThreadLocal 命名的由来。既然每个 Thread 有自己的实例副本,且其它 Thread 不可访问,那就不存在多线程间共享的问题。

2023-05-09 15:20:01 3497 3

原创 【Java 并发编程】一文详解 Java 内置锁 synchronized

关键字 synchronized 可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,同时可以保证一个线程的变化可见(可见性),即可以代替 volatile。关键字加到 static 静态方法和代码块上都是是给 Class 类上锁。关键字加到实例方法上是给对象实例上锁。/*** 提供一个私有的静态属性,对于 volatile 修饰的字段,可以防止指令重排/*** 提供一个私有构造函数:避免类在外部被实例化。

2023-05-05 21:45:25 1270 3

原创 【Java 并发编程】一文详解 Java volatile关键字

Java 内存模型(Java Memory Model,JMM),是一种抽象的模型,并不真实存在。所有的共享变量都存储在主内存(Main Memory)中,这里所说的变量指的是实例变量和类变量,不包含局部变量,因为局部变量是线程私有的,因此不存在竞争问题。每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的拷贝副本。线程对变量的所有操作(读/写)都必须在本地内存中进行,而不能直接读写主内存。

2023-05-05 15:14:35 406 3

转载 【Java】不可不说的Java“锁”事

Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8和Netty 3.10.6)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。本文Java中常用的锁以及常见的锁的概念进行了基本介绍,并从源码以及实际应用的角度进行了对比分析。

2023-04-28 09:58:39 106

原创 【Java 并发编程】一文了解线程间有哪些通信方式?

关键字 synchronized 可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性。可以通过 Java 内置的等待/通知机制 - wait()、notify/notifyAll() 实现一个线程修改一个对象的值,而另一个线程感知到了变化,然后进行相应的操作。通知一个在对象上等待的线程,使其从 wait() 方法返回,而返回的前提是该线程获取到了对象的锁,没有获得锁的线程重新进入 WAITING 状态。

2023-04-14 16:42:43 675 3

原创 【Java 并发编程】一文读懂线程、协程、守护线程

为什么用户线程又被称为协程呢?我们知道,内核线程的切换开销是来自于保护和恢复现场的成本, 那如果改为采用用户线程, 这部分开销就能够省略掉吗?答案还是“不能”。但是,一旦把保护、恢复现场及调度的工作从操作系统交到程序员手上,则可以通过很多手段来缩减这些开销。

2023-04-02 15:11:56 1959 13

原创 【Java 并发编程】Java 线程的生命周期

本文来一起学习 Java线程的生命周期new - 初始、runnable - 运行、blocked - 阻塞、waiting - 等待、timed_waiting - 超时等待、terminated - 终止。

2023-04-01 23:11:16 694 12

原创 【Java 并发编程】一文详解 Java 中有几种创建线程的方式

一个 Java 程序从main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上,因为执行 main() 方法的是一个名称为main 的线程。不同的 JDK 版本,启动的线程数会有差异,但这依然证明了 Java 程序天生就是多线程的。

2023-03-26 15:33:00 964 22

原创 【Java 并发编程】我们为什么要学并发编程?

可以看到,在互联网大厂 Java 开发岗的并发编程属于标配。当然,在中小型企业并发编程的能力也是加分项,在工作中善用并发编程不仅能提高公司项目的使用体验,也能提升程序员在公司的技术话语权。

2023-03-25 10:55:14 766

原创 【Redis】Redis 是如何保证高可用的?(背诵版)

其中一个节点 node 向另⼀个节点 node (指定 ip 和 port)发送 CLUSTER MEET 命令,这样就可以让两个节点进⾏握⼿(handshake),当握⼿成功后,node 节点就会将指定 ip 和 port 的节点添加到 node 节点当前所在的集群中。另外受限于硬件和成本,拓展内存的成本太⼤,⽐如拓展到 1T 内存。从节点加载 RDB 完成后,master 将 replication buffer 缓冲区的数据发送到从节点,slave 接收并执⾏,从节点同步⾄主节点相同的状态,保证。

2023-03-18 13:35:32 2173 25

原创 【Redis】高可用架构之Cluster集群和分⽚

主从模式哨兵模式。解决了:在Redis实例发生故障时,具备主从自动切换、故障转移的能力,最终保证服务的高可用。随着我们业务规模的不断扩展,用户量膨胀,并发量持续提升,原有的主从架构,已不足以支撑。Redis并发量10万 / 每秒 ,但是有些业务需要 100万的 QPS数据量,我们普通机器 16~256g,而我们的业务需要500g并发量大了 -> 主从复制解决主从稳定性 -> 哨兵解决单节点的写能力、存储能力、动态扩容都很麻烦 -> 集群 Cluster 解决。可扩展性高可用性负载均衡错误恢复。

2023-03-15 10:24:08 1730 43

原创 【Redis】高可用架构之哨兵模式 - Sentinel

Redis 主从复制 + 读写分离。为Redis 配置主从模式,可以大幅度提高 Redis 的可用性,减少甚至避免 Redis 服务发生宕机的可能。故障隔离和恢复:无论主节点或者从节点宕机,其他节点依然可以保证服务的正常运行,并可以手动切换主从。读写隔离:Master 节点提供写服务,Slave 节点提供读服务,分摊流量压力,均衡流量的负载。提供高可用保障:主从模式是高可用的最基础版本,也是哨兵模式和 cluster模式实施的前置条件。尽管 Redis 主从模式已经做的足够多了,但其还是存在不小的问题。

2023-03-13 20:41:27 2579 45

原创 【Redis】Redis 主从复制 + 读写分离

Redis 的数据持久化技术,可以解决机器宕机,数据丢失的问题,并没有从根本上解决 Redis 的可用性。我们需要的是解决 Redis 的高可用,减少甚至避免 Redis 服务发生宕机的可能,来从根本上解决数据丢失问题。Redis 数据持久化:AOF和RDB主从复制的作用一个是为分担读写压力,均衡负载,另一个是为了保证部分实例宕机之后服务的持续可用性,所以 Redis 演变出主从架构和读写分离。建立连接的阶段、数据同步的阶段、基于长连接的命令传播阶段。数据同步可以分为全量复制和部分复制。

2023-03-12 16:35:19 1989 8

原创 【Redis】Redis 如何实现分布式锁

分布式锁其实就是,控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共享了某个临界资源,往往需要互斥来防止彼此干扰,以保证一致性。

2023-03-04 18:30:08 1710 21

原创 【Redis】什么是缓存与数据库双写不一致?怎么解决?

在实际开发中,开发人员使用 “缓存 + 过期时间” 的策略来实现加速数据读写和内存使用率,这种策略能满足大多数业务场景。但还是会有一些问题:当前 key 是一个热点 key(某时间管理大师登顶微博热搜第一),并发量非常大;在缓存失效瞬间,重建缓存不能在短时间完成(可能是一个负责业务场景,需要经过复杂的计算、多次IO、多次服务之间调用等等),有大量线程来重建缓存,造成后端负载加大,甚至可能会让应用崩溃。下面一起看一下热点缓存重建场景下的解决方案。

2023-02-28 21:57:53 2018 18

原创 【Redis】一文搞懂 Redis 中的缓存穿透、缓存击穿、缓存雪崩及其解决方案

缓存穿透是指客户端查询一个缓存、数据库都不存在的数据,导致客户端每次请求数据都会透过缓存,直接查询数据库,返回 null 给客户端。如果有恶意攻击者不断请求系统中不存在的数据,会导致短时间大量请求落在数据库上,造成数据库压力过大,甚至击垮数据库系统。缓存击穿是指,当缓存中的某个热点数据(key)过期了,在该热点数据重新载入之前,有大量的请求穿过缓存,直接查询数据库。这种情况会导致数据库压力瞬间骤增,造成大量请求阻塞,甚至直接挂掉。缓存雪崩是指,当缓存中有大量的 key 在同一时刻过期,或者。

2023-02-26 21:14:38 1134 18

原创 【Redis】Redis 的过期策略以及内存淘汰机制详解

hz 默认是 10。惰性删除不是去主动删除,而是在你要获取某个 key 的时候,Redis 会先去检测一下这个 key 是否已经过期,如果没有过期则返回给你,如果已经过期了,那么 Redis 会删除这个 key,不会返回给你。Slave 在读取过期键时,不会做判断删除操作,而是继续返回该键对应的值,只有当 Master 发送 DEL 通知,Slave 才会删除过期键,这是统一、中心化的键删除策略,保证主从服务器的数据一致性。Master 载入 RDB 时,文件中的未过期的键会被正常载入,过期键则会被忽略。

2023-02-23 21:26:49 3411 28

原创 【MySQL】MySQL information_schema 数据库详解

information_schema 是 MySQL 自带的数据库,它提供了访问数据库元数据的方式。(1)什么是元数据?元数据(MetaData),即数据的数据,是指定义数据结构的数据。那么数据库元数据就是指定义数据库各类对象结构的数据。例如数据库中的数据库名,表明, 列名、用户名、版本名以及从SQL语句得到的结果中的大部分字符串是元数据。(2)MySQL 中的 information_schema数据库在 MySQL 中,把 information_schema 看做是一个数据库,确切的说是信息数据库。

2023-02-18 14:19:41 2725 2

原创 【MySQL】MySQL 8.0 新特性之 - 公用表表达式(CTE)

MySQL 从 8.0 开始支持 WITH 语法,即:Common Table Expressions - CTE,共用表表达式。CTE 是一个命名的临时结果集合,仅在单个 SQL 语句(select、insert、update 或 delete)的执行范围内存在。与派生表类似的是:CTE 不作为对象存储,仅在查询执行期间持续。与派生表不同的是:CTE 可以是自引用(递归CTE),也可以在同一查询中多次引用。此外,与派生表相比,CTE 提供了更好的可读性和性能。

2023-02-09 21:57:25 2031 18

原创 【MySQL】MySQL 8.0 新特性之 - 窗口函数(Window Functions)

窗口可以理解为记录集合,窗口函数就是在满足某种条件的记录集合上执行的特殊函数。每条记录都要在此窗口内执行函数。静态窗口:每条记录都要在此窗口内执行函数,窗口大小都是固定的。不同的记录对应着不同的窗口,这种动态变化的窗口叫滑动窗口。窗口函数也称为 OLAP(Online Anallytical Processing)函数,意思是对数据库数据进行实时分析处理。窗口函数就是为了实现 OLAP 而添加的标准 SQL 功能。窗口函数对一组查询行执行类似聚合的操作。然而,聚合操作将查询行分组为单个结果行,而。

2023-02-04 15:17:26 1463 9

转载 【Redis】- Redis 7.0 Multi Part AOF的设计和实现

顾名思义,MP-AOF就是将原来的单个AOF文件拆分成多个AOF文件。BASE:表示基础AOF,它一般由子进程通过重写产生,该文件最多只有一个。**INCR:**表示增量AOF,它一般会在AOFRW开始执行时被创建,该文件可能存在多个。HISTORY:表示历史AOF,它由BASE和INCR AOF变化而来,每次AOFRW成功完成时,本次AOFRW之前对应的BASE和INCR AOF都将变为HISTORY,HISTORY类型的AOF会被Redis自动删除。

2023-01-19 11:34:53 244 2

原创 【Redis】 - Redis 6.0 新特性之客户端缓存

antirez 写了一篇有关客户端缓存设计的想法:《antirez 认为,Redis 接下来的一个重点是配合客户端,因为客户端缓存显而易见的可以减轻 Redis 的压力,速度也快很多。实际上,几乎每个大公司都有实现这种应用端缓存的机制,antirez 想通过 server 端的一些设计来减少客户端缓存实现的复杂度和成本,甚至不惜在 Redis 协议上做修改。

2023-01-18 14:32:46 1312 6

原创 【Redis】 - Redis 6.0 新特性之多线程模型

在执行命令阶段:Redis是单线程来执行命令的,每一条到达读服务端的命令并不会立即执行,所有的命令都会进入一个 socket 任务队列中,当 socket 可读则交给单线程事件分发器逐个被执行,即一个线程处理所有网络请求。如下图所示:从Redis 4.0 以后并不是严格意义上的单线程,除了主线程外,Redis 也有后台线程或子进程处理一些其他较为缓慢的操作(例如:无用连接的释放、慢IO访问和一些其他类似操作 - 清理脏数据、生成快照、AOF重写等)。

2023-01-17 10:51:06 2691 24

原创 【Redis】 - Redis持久化:AOF和RDB

随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。AOF文件重写是把Redis进程内的数据转化为写命令同步到新AOF文件的过程。

2022-12-22 15:07:10 892 4

原创 【Redis】 - Redis为什么这么快?

Redis的底层数据结构一共有六种,分别是:内存直接由 CPU 控制,也就是 CPU 内部集成的内存控制器,所以说内存是直接与 CPU 对接,享受与 CPU 通信的最优带宽。Redis 将数据存储在内存中,读写操作不会因为磁盘的 IO 速度限制。CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。在计算机的世界中,CPU的速度是远大于内存的速度的,同时内存的速度也是远大于硬盘的速度。Redis 的操作都是基于内存的,绝大部分请求是纯粹的内存操作,非常迅速。Redis

2022-12-07 15:08:49 494 1

原创 【MySQL】 MySQL 8.0 新特性之原子 DDL

MySQL 8.0 开始支持原子数据定义语言 (DDL) 语句,即。。该操作要么被提交(相应的变更被持久化到数据字典、存储引擎和二进制日志中);要么被回滚(执行过程中出现错误,甚至是服务器宕机)。不是。一条 DDL 语句(无论是原子的还是其他的),都会隐式结束当前会话中活动的任何事务,就像在执行语句之前执行了一样。这意味着 DDL 语句不能在另一个事务执行,也不能在事务控制语句:中执行,或与同一事务中的其他语句组合。MySQL 8.0 中引入 MySQL 数据字典,使原子 DDL 成为可能。

2022-10-16 09:17:02 1299 6

原创 【MySQL】 MySQL 8.0 新特性之数据字典

MySQL Server 8.0 合并了一个全局的事务数据字典,用于存储有关数据库对象的信息,也有了原子DDL功能。在 MySQL 以前的版本中,字典数据存储在元数据文件、非事务性表和特定于存储引擎的数据字典中。在学习 MySQL 数据字典之前,先一起了解一下什么是数据字典和元数据:数据字典就类似于系统编目或花名册,它保存数据库服务器上的元数据信息(数据库的整体属性信息)。元数据信息包括:数据库的属性信息、数据表的属性信息、字段的属性信息、视图的属性信息、用户信息、统计类信息等。

2022-10-15 10:10:48 4621 1

原创 【MySQL】 Docker 安装 MySQL8.0(mac)

注意@后面“%”允许远程登入,with mysql_native_password 修饰允许旧模式的客户端登入。

2022-10-14 17:28:45 1185

原创 【MySQL】MySQL 发展历程和主流分支

MySQL从最初的1.0、3.1到后来的8.0,发生了各种各样的变化。被Oracle收购后,MySQL的版本演化出了多个分支,除了需要付费的MySQL企业版本,还有很多MySQL社区版本。还有一条分支非常流行的开源分支版本叫Percona Server,它是MySQL的技术支持公司Percona推出的,也是在实际工作中经常碰到的。Percona Server在MySQL官方版本的基础上做了一些补丁和优化,同时推出了一些工具。另外一个非常不错的版本叫MariaDB,它是MySQL的公司被Oracle收购后,M

2022-10-13 10:53:45 3816 13

原创 【SpringBoot】仿 spring-boot-project 自定义 starters

自定义的框架基础,这里封装了统一响应结果、基础异常、基础错误码枚举、校验工具类等共用类,同时也引入了一些共用依赖,原则上每个新建的工程都需要引用此 module。- 空文件包,此包是对 pointer-boot-build 进行了依赖管理。在构建大型微服务框架时常常会引入此包,统一对依赖包进行版本管理。

2022-10-09 15:46:42 476

原创 【SpringBoot】Maven 版本管理与 flatten-maven-plugin 插件的使用及分析

默认只有打包的时候(package、install、deploy)会将 .flattened-pom.xml 做为当前项目的 pom 文件,但是打包类型 pom 的 pom.xml 中的占位符是不会被替换的。But,在大多数互联网公司中,几乎每个项目都处在版本快速迭代中,甚至一两周更新一个小版本,一个月更新一个大版本。修改完以后编译运行都没问题。我们可以在 spring-boot 和 spring-cloud-alibaba 的开源项目中看到,其就是利用 revision 占位符来进行统一版本管理的。

2022-10-08 17:13:03 9912 9

Windows版redis---Redis-x64-3.2.100.zip

Windows版redis---Redis-x64-3.2.100.zip

2020-12-30

空空如也

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

TA关注的人

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