- 博客(32)
- 收藏
- 关注
原创 【白话树】之 二叉树
二叉树:是一种非线性数据结构,是“分而治之”思想的一种实现。和链表一样,二叉树最基本的单位也是节点。只是二叉树的节点,不仅包含值本身,也包含了左子节点和右子节点的引用。二叉树(binary tree)是n(n≥0)个节点构成的集合,它或为空树(n=0),或满足以下两个条件:1)有且仅有一个称为根的节点;2)除根节点以外,其余节点分为两个互不相交的子集T1和T2,分别称为T的左子树和右子树,且T1和T2本身都是二叉树。
2024-09-15 22:23:48
1063
原创 【白话Redis】缓存雪崩、穿透、击穿、失效和热点缓存重建
由缓存机器故障宕机,导致大量请求全部落到数据库,超出了数据库的处理能力极限,进而导致数据库压力增大、宕机的情况。大批量请求缓存和数据库中都不存在的数据,导致数据库压力变大,甚至宕机。某个热点key访问非常频繁,且请求时间比较集中,是高并发场景。当这个key失效的瞬间,大量的请求直接落到数据库,导致数据库压力骤增,甚至宕机。
2024-09-11 22:24:02
1156
1
原创 【白话Spring】三级缓存
容器只是个工具,怎么用才是我们需要了解的关键,什么时候给容器里存入Bean,把Bean存入哪个容器,什么时候清空容器,这就不得不了解一下Spring中Bean的生命周期了。设想一下没有三级缓存的循环依赖问题:ServiceA依赖ServiceB,ServiceB依赖ServiceA。每次获取到的都是新的代理对象,就破坏了Spring解决循环依赖问题的基础,即所有的对象都是单例的。解决循环依赖的问题有两级缓存就够了,为什么要用三级缓存呢?从上面的代码中可以看出,三级缓存就是3个全局的Map。
2024-09-11 22:23:29
4487
8
原创 【白话MQ】消息队列MQ的使用和选型
而使用MQ作为一个消息的缓冲区,系统A把所有对其他系统的同步通知消息都交给MQ,然后再由需要消息的其他B、C、E系统消费消息,可以有效的降低系统之间的耦合度。(为什么耗时差距这么大?使用MQ之后,无非是多了一个外部依赖,影响微乎其微,但是当MQ挂掉之后,整个系统都将奔溃,这是我们所不能承受的。系统A对数据的修改,实时同步更新到B、C、D系统中,且在同步过程中,系统A在当前线程中不能做任何其他的操作。在架构设计时,我们假定的情况就是MQ是可用的,交给MQ的消息都以符合我们心意的方式来为其他系统提供服务。
2024-09-10 12:31:59
1448
原创 【分布式系统】之 分布式事务解决方案 Seata
分布式事务,分开来讲就是分布式和事务。分布式:是一种抽象规范,即分别部署在不同的服务器节点的模式不同功能的模块的分开部署相同功能的模块基于高性能高并发高可用的集群部署事务:是一组原子性的执行过程,该过程要么全部执行成功,要么全部执行失败,不存在中间状态。
2024-08-19 09:56:11
1139
原创 【Spring】BeanFactory和FactoryBean
BeanFactory:是Spring框架最核心的Bean的创建及管理容器FactoryBean:是一种特殊的Bean,可以实现一些复杂的Bean的创建。
2024-08-19 09:54:36
459
原创 【源码分析】之 ThreadPoolExecutor详解
使用小队列通常需要较大的池大小,这会使CPU更忙,但可能会遇到不可接受的调度开销,这也会降低吞吐量。例如,在网页服务器中。在这里,如果没有线程立即可用来运行任务,则尝试排队任务将失败,因此将构造一个新线程。如果工作线程或使用池的其他线程没有此权限,服务可能会降低:配置更改可能无法及时生效,关闭的池可能保持在可能终止但未完成的状态。,也能回收未引用的池,那么您必须通过设置适当的保持活动时间,使用零核心线程的下界和/或设置。如果线程池在程序中不再被引用,并且没有剩余的线程,那么线程池将被自动关闭。
2024-08-03 13:31:01
880
原创 【源码分析】之 线程池工具类 Executors详解
该类为Executor和Callable类定义了工厂和工具方法。通过对以上源码的分析,可以发现虽然Executors工具类提供了很多快速创建线程池的方法,但归根结底还是对ThreadPoolExecutor、ScheduledThreadPoolExecutor的封装。我们可以很容易的根据自己的项目情况去自定义,这样的创建的线程池才是最符合业务场景的。在Executors提供的快速创建线程池的方法中,若有贴合使用业务场景的,可以直接使用,这样可以提高开发效率,避免重复造轮子。
2024-08-03 11:55:43
1077
原创 Java SPI 机制详解
文件夹下的 services 文件夹下的文件,将这个文件夹下面的所有文件先加载到内存中,然后根据这些文件的文件名和里面的文件内容找到相应接口的具体实现类,找到实现类后就可以通过反射去生成对应的对象,保存在一个 list 列表里面,所以可以通过迭代或者遍历的方式拿到对应的实例对象,生成不同的实现。所以会提出一些规范要求:文件名一定要是接口的全类名,然后里面的内容一定要是实现类的全类名,实现类可以有多个,直接换行就好了,多个实现类的时候,会一个一个的迭代加载。修改或者替换服务实现并不需要修改调用方。
2024-07-16 17:20:45
1509
原创 【扫盲】并查集2
在树中进行合并操作时,总是将秩(树的高度)较小的树连接到秩较大的树的根上,这样可以保证树的深度尽可能小,从而提高查询效率。同时,它也支持高度平衡的合并策略,即合并两个高度相同的子树时,将较低的子树连接到较高的子树上,并可能增加较高子树的高度。操作中通过递归查找时将路径上的每个节点直接连接到根节点,以减少查找时间。除了使用路径压缩这种优化措施,还可以使用。这个实现支持路径压缩,即在。
2024-07-15 22:27:14
186
原创 MySQL InnoDB 共享锁和独占锁
如果事务T1持有行r上的排他(X)锁,那么某个不同事务T2对r上任何一种类型的锁的请求都不能立即被授予。相反,事务T2必须等待事务T1释放对行r的锁。T2对S锁的请求可以立即被授予。因此,T1和T2都对r持有S锁。T2对X锁的请求不能立即被授予。更多InnoDB锁机制,请移步。其中有两种类型的锁,共享 () 锁允许持有该锁的事务。) 锁允许持有该锁的事务。
2024-07-12 18:46:08
247
原创 Spring Cloud Hystrix原理分析涉及设计模式之命令模式小记
命令模式:23中设计模式之一,将来自客户端的请求封装成一个对象,从而让你可以使用不同的请求对客户端进行参数化。可以被用于实现 “行为请求者”与“行为实现者”的解耦,以便使两者可以适应变化。下面的示例是对命令模式的简单实现://接收者public class Receiver { public void action(){ //真正的业务逻辑 }}//抽象命令public i...
2018-09-07 15:09:07
1000
1
算法界的 Hello World,简洁但不简单
2024-07-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人