自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM 类加过程及类加载器简介

简单了解类加载过程,详细介绍类加载器的双亲委派模型

2022-06-26 17:33:08 172 1

原创 Redis 系列--高可用&集群方案

一般我们在使用 Redis 时,鉴于单机存在的单点故障,容量有限,高并发压力问题,都不会采用单机模式,那么该如何设计 Redis 的部署方式来解决诸如单点故障,容量有限,高并发压力这样的问题呢?首先来看下单点故障的问题,单点故障一般就是指提供服务的节点或实例只有一个,当这个节点出现故障就导致这个服务不可用。解决这种问题一般会引入主备或主从的概念。主备模式就是主机向外提供服务,备机从主机同步数据,只有当主机出现故障时,备机才代替主机向外提供服务。主从模式下,从节点从主节点同步数据,同时也提供部分服务(对于主

2021-08-17 15:14:56 1428 2

原创 Redis 系列--缓存问题(缓存更新以及缓存穿透/缓存击穿/缓存雪崩)

使用 Redis 作为缓存时,一般的设计方案是:用户发起查询请求时,先从缓存中进行查询,如果数据存在则直接返回,否则查询数据库后更新缓存并返回。这种设计可以满足并发量较小的系统要求,当并发量增大或者遇到恶意攻击时,则可能导致大量请求达到数据库导致数据库压力增大甚至不可用。为了最大可能的减小数据库压力,在使用 Redis 做缓存时,就需要做周全的设计,其中要解决的比较典型的问题就是缓存穿透,缓存击穿,缓存雪崩。1. 缓存穿透缓存穿透是指用户不断请求缓存和数据库中都没有的数据。这时的用户很可能是攻击者,

2021-07-23 15:33:01 308

转载 转载《高性能网关设计实践》

原文地址:https://mp.weixin.qq.com/s/oAh5IojX_iz01nbf8mJMSQ

2020-07-16 16:05:06 152

转载 转载《分布式ID生成方案总结》

原文地址:https://www.cnblogs.com/yuandengta/p/12697595.html

2020-07-16 10:26:23 132

转载 转载《高性能短链接设计》

文章地址:https://mp.weixin.qq.com/s/YTrBaERcyjvw7A0Fg2Iegw

2020-07-16 09:17:48 177

原创 Redis 系列--Jedis 源码解读

Jedis 作为 Redis 官方推荐的三个客户端之一,相比于其他两个(Lettuce,Redisson)而言,它提供最基本的客户端功能,也因此使得它具备简单和轻量的特性。此外,它也是线程不安全的客户端,因此不适用在多线程场景中。本篇我们通过对其源码的阅读来了解 Redis 的客户端是如何进行工作的,同时也去找出它线程不安全的原因。版本说明:本片源码解读基于 Jedis-3.3.0,请注意区分。1. 初始化首先我们从 Jedis 的基本使用说起,最简单的使用方式如下:Jedis jedis .

2020-07-15 16:55:10 669

原创 Redis 系列--持久化

Redis 持久化是面试中的热门,重要性不言而喻。对开发者来说,掌握 Redis 的持久化不仅可以从容应对面试,在实际工作中对 Redis 的使用也有重要的指导意义。Redis 的持久化大体上可以分为三种:RDB,AOF 和混合持久化。RDB 和 AOF 持久化机制各有千秋,混合持久化将两者结合取其精华。1. RDBRDB 的持久化方式是对 Redis 内存数据快照进行序列化,因此当 Redis 缓存的数据比较大时,这将是一个很耗时的操作,耗时一方面是在对数据的序列化上,另一方面是在数据的刷盘上。.

2020-07-03 19:34:33 156

原创 Redis 系列--布隆过滤器

当我们在使用 Redis 作为缓存时,一个需要考虑的问题就是缓存穿透,缓存穿透有多种类型,不同的类型也有不同的解决方案,布隆过滤器作为一种解决方案之一。布隆过滤器主要用于判断某个元素是否包含在某个超大的元素集合之中。当元素的集合大到一定程度时,我们将元素一一存储再通过查找判断,是非常消耗存储资源,同时性能也是非常低下的,这种场景正是布隆过滤器的用武之地。版本说明:本篇基于 Redis-5.0.8 以及 RedisBloom-2.0.0。1. 准备Redis-5.0.8 官方地址:Redis-5.

2020-06-27 14:26:33 290

原创 设计模式系列--代理篇

代理模式属于 GoF 中的结构型设计模式。也是我们最常见到的设计模式之一,典型的 Controller、Service、Dao 分层设计中,上层就是对下层的静态代理;Spring 中 AOP 的实现是基于动态代理。代理模式起到保护被代理对象的目的,同时对被代理功能进行增强,同时由于代理对象的引入,增加了系统的复杂度,也使类的调用变得复杂。代理模式分为静态代理和动态代理两种。1. 静态代理静态代理适合对固定功能的代理,实现也比较简单,只需要代理对象持有被代理对象的引用,在被代理对象现有功能的基础上进.

2020-06-22 11:01:07 177

原创 MyBatis 工作原理解析

MyBatis 作为一个轻量的 ORM 框架,与 Hibernate 相比,它的学习成本相对较低,尤其适合初级开发使用。本篇我们将介绍原生 MyBatis 的工作原理,并从设计模式的角度去分析其设计。版本说明:本次源码解读基于 3.5.1 版本,请注意区分版本差异。1. 原生 API 的基本使用String resource = "org/mybatis/example/mybatis-config.xml";InputStream inputStream = Resources.getRe.

2020-06-20 19:59:54 263

原创 计算机网络系列--TCP 篇

TCP 是因特网协议栈中运输层(传输层)常用的协议,该协议的全称为 Transmission Control Protocol(传输控制协议),它提供了一种可靠的数据传输,而因特网协议栈中运输层的另一种常用的协议则不提供可靠的数据传输,它在网络层提供的服务基础上不提供不必要的服务。本篇我们将从 TCP 的流量控制和拥塞控制两个方面简单介绍 TCP 可靠数据传输的实现原理,顺便简单介绍一下 TCP 的连接管理。0. TCP 报文段(Segment)结构源端口:发送方应用程序所在的端口;目的端口:接.

2020-05-26 16:44:59 866

原创 设计模式系列--原型&建造者

原型模式与建造者模式都属于创建型的模式,也是比较常见的模式。1. 原型模式原型模式常常用于复杂对象的复制,常常将需要用到原型模式的类设计成 Cloneable,这种方式实现的事浅克隆。如果需要实现深克隆,则需要将其成员对应的类也设计成 Cloneable,并进行递归,这种方式比较繁琐,通常我们使用一种简便的方式——序列化和反序列化,采用这种方式要求我们将需要序列化的类及其成员对应的类设计成 Seriable。public class PrototypeBean implements Cloneab.

2020-05-23 18:46:39 168

原创 JUC 源码解读系列--ThreadLocal 篇

ThreadLocal 一般被用作变量在单个线程中的副本。每个线程都持有同一个变量的副本,并且可以对这个副本进行修改而不影响其他线程对此变量的使用。我们使用 ThreadLocal 时,一般都是采用匿名内部类的形式,通过覆盖 initValue() 方法进行副本的初始化。在使用过程中可以对副本进行删改查操作,分别对应 remove()、set()、get() 方法。1. initValue()// 默认的初始值为 null,此方法一般被子类覆盖protected T initialValue().

2020-05-14 17:09:03 278

原创 设计模式系列--单例篇

单例模式是我们日常接触的最常见的一种创建型设计模式,spring IoC 容器中的 bean 实例默认就是单例的。采用单例模式可以降低对象的内存开销。本篇主要从单例的常见实现方式及各种方式存在的问题进行分析。单例的特点:私有化构造方法;全局唯一的实例;对外提供唯一实例的访问点。1. 懒汉式单例懒汉是单例顾名思义就是延迟实例化,只在使用的时候才进行实例化。下面这种方式的懒汉式单例是懒汉式单例的常见实现方式,这种方式需要我们自己编码来保证线程安全,同时还要防止暴力反射对单例的破坏。pub.

2020-05-13 19:07:02 226

原创 设计模式系列--工厂方法&抽象工厂篇

工厂方法模式和抽象工厂模式都属于创建型的设计模式。我们主要在对象的创建逻辑比较复杂的情况下使用这两种模式来隐藏创建的细节,这两种模式针对的产品的复杂度不同,但又有很大的相似,因此本篇将两者放到一起来加深对二者的理解。在介绍这两种设计模式之前,我们先了解一下简单工厂模式,这种模式不在 GoF 23 种设计模式之列。1. 简单工厂模式简单工厂模式适用于产品等级比较简单的系列对象的创建。这里需要先了解两个重要的概念,产品等级结构和产品族。产品等级结构可以看作是同一类型的产品的集合,比如手机,有华为品.

2020-05-13 15:19:20 153

原创 设计模式系列--软件设计原则篇

七大软件设计原则是设计模式的指导思想,也是我们编程时需要权衡并遵循的准则,在这些准则的约束下,使得我们的程序更加的健壮。1. 开闭原则定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。定义补充:用抽象构建框架,用实现扩展细节。优点:提高软件系统的可复用性以及维护性。2. 依赖倒置原则定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象。定义补充:抽象不应该依赖细节,细节应该依赖抽象。针对接口编程,不要针对实现编程。优点:可以减少类间的耦合性、提高系统稳定性,提高代码可读性.

2020-05-11 19:30:40 325

原创 Java 集合框架源码解读系列--Stack 篇

Stack 继承了 Vector,其中的压栈及弹栈操作也只是复用了父类中既有的方法。publicclass Stack<E> extends Vector<E> { /** * Creates an empty Stack. */ public Stack() { } /** * Pushes an item onto the top of this stack. This has exactly * .

2020-05-08 22:57:50 153

原创 Java 集合框架源码解读系列--Vector 篇

Vector 作为一款古老的集合工具(since JDK1.0),从 JDK1.2 开始被改造成 List 的实现加入集合框架。它的实现基本与ArrayList相同,主要区别在于它是一个线程安全的集合。1. 属性及构造/** * The array buffer into which the components of the vector are * stored. The capa...

2020-05-06 23:43:33 179

原创 Java 集合框架源码解读系列--LinkedList 篇

1. 简介LinkedList 实现了 List 和 Deque 接口,Deque 是 Double Ended Queue 的缩写,从名字就可以看出,Deque 是支持对其两端进行操作的队列,它继承了 Queue 接口,在普通队列的基础上进行了扩展,增加了一些对队列首尾进行操作的方法。2. 属性及构造// 链表中节点的数量transient int size = 0;/** *...

2020-05-06 20:44:20 187

原创 K8S入门篇

01 Controllers官网:https://kubernetes.io/docs/concepts/workloads/controllers/ReplicationController(RC)官网:https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/A Replicat...

2020-05-05 21:05:54 271

原创 Java 集合框架源码解读系列--TreeMap 篇

TreeMap 底层使用的是红黑树的结构,查询或者修改的时间复杂度为 O(logN),前面我们在 HashMap 篇以及 ConcurrentHashMap 篇中跳过了红黑树的处理部分,本篇将对红黑树进行详细的介绍。1. 红黑树红黑树是在二叉树的基础上进行了一些约束来使二叉树趋于平衡,它是二叉查找树的一种实现。这些约束有:每个节点必须是黑色或红色;根节点必须是黑色;叶子节点必须是黑...

2020-05-05 20:47:07 154

原创 Java 集合框架源码解读系列文章索引

集合框架系列包含的文章较多,本篇将系列涉及的文章整理出一个索引,便于大家及自己查找。集合框架的类关系图如下:下面以图表的形式对各个集合的实现进行对比:类名是否允许重复元素是否允许元素为空是否线程安全线程安全的实现方式扩容时机扩容机制文章链接ArrayList是是否-数组填满时扩容至原来的1.5倍查看LinkedList————...

2020-05-05 09:23:30 165

原创 JUC 源码解读系列--FutureTask 篇

前面在介绍线程池 ThreadPoolExecutor 时,只关注了执行任务的方法 execute(),ThreadPoolExecutor 中执行任务还有另一个方法–submit(),此方法支持带返回值的线程任务。其底层是基于 FutureTask 来实现的,该类也是 JUC 中提供的并发工具,本篇我们一起走进它的实现细节。版本说明:本次源码解读基于 JDK1.8,请注意区分。1. ...

2020-05-04 21:07:58 222

原创 Java 集合框架源码解读系列--ArrayList 篇

ArrayList 是集合框架中最常用的集合工具之一,其底层实现比较简单,本篇我们主要了解它的迭代器的实现细节,与 CopyOnWriteArrayList 的迭代器对比,来分析两者的适用场景。1. 重要属性及构造方法/** * Default initial capacity. */// 默认的初始容量private static final int DEFAULT_CAPACI...

2020-05-01 18:11:27 197

原创 Java 集合框架源码解读系列--CopyOnWriteArrayList 篇

最近在读 Tomcat 源码时发现,存放容器事件监听器 ContainerListener 的容器使用的是 CopyOnWriteArrayList,于是忍不住想去了解它的实现原理,这里同大家一起分享下。首先我们从集合框架的体系图开始,先对 CopyOnWriteArrayList 在集合框架中的层次和位置有一个了解。...

2020-05-01 12:09:38 151

原创 Java 集合框架源码解读系列--LinkedHashMap 篇

LinkedHashMap 子类,对 HashMap 功能进行了扩展,它通常被用在 LRU 的场景中,对于元素的插入和删除操作,实现上完全来自于 HashMap,其主要是重写了 HashMap 中提供的可扩展的方法 afterNodeAccess、afterNodeInsertion 和 afterNodeRemoval,因此本篇我们重点看这三个方法,插入和删除的基本操作的实现,可参考本系列的 ...

2020-04-29 15:20:23 137

原创 Java 集合框架源码解读系列--HashTable 篇

版本说明:本次源码解读基于 JDK1.8,请注意区分版本差异。1. 重要属性及构造方法属性/** * The hash table data. */private transient Entry<?,?>[] table;// 存放元素的数组/** * The total number of entries in the hash table. */priva...

2020-04-27 10:10:17 167

原创 Java 集合框架源码解读系列--HashMap 篇

版本说明:本次源码解读基于 JDK1.8,请注意区分版本差异。本来计划这段时间继续完善 Tomcat 源码解读系列,但是发现要有所产出的话,需要花费大量的时间,因此这段时间在研读 Tomcat 源码的间隙,穿插着整理一下 Java 集合框架的源码解读系列,同时也为了复习一下基础知识。1. 重要属性/** * The table, initialized on first use,...

2020-04-26 22:57:03 192

原创 JUC 源码解读系列--SynchronousQueue 篇

SynchronousQueue 通常被称为无界队列,队列中不存储具体的元素,一个插入操作的完成必须建立在另一个线程的删除操作上。正如官方注释中所说,它看起来更像一个通道。1. offer()public boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException { if (e =...

2020-04-23 16:27:36 164

原创 JUC 源码解读系列--ArrayBlockingQueue 篇

ArrayBlockingQueue 提供的功能与 LinkedBlockingQueue 基本相同,且都是 FIFO 的队列。两者的差别主要在于底层的数据结构不同,本篇的初衷在于熟悉 ArrayBlockingQueue 中的游标的设计。1. offer()public boolean offer(E e, long timeout, TimeUnit unit) throws ...

2020-04-21 21:05:13 129

原创 JUC 源码解读系列--LinkedBlockingQueue 篇

LinkedBlockingQueue 是 JUC 中常用的 FIFO 阻塞队列,本系列中我们在了解线程池的原理时,其中 newSingleThreadExecutor 和 newFixedThreadPool 方法中默认的任务队列就是 LinkedBlockingQueue。此外,我们可以使用此队列实现在同一进程中对生产者和消费者的异步化。1. offer()public boolean...

2020-04-19 15:06:40 188

原创 JUC 源码解读系列--ConcurrentHashMap 篇

本篇源码解读基于 JDK1.8,请注意区分版本。1. ConcurrentHashMap()// 构造函数中,我们重点看一下 sizeCtl 这个属性public ConcurrentHashMap(int initialCapacity) { if (initialCapacity < 0) throw new IllegalArgumentExcepti...

2020-04-18 22:28:00 181

原创 JUC 源码解读系列--ThreadPoolExecutor 篇

线程池的出现将开发人员从线程的管理中解放出来,让开发人员有更多精力去关注业务代码。但是 JUC 中对线程池的高度封装,让不少开发人员渐渐忽视或生疏了线程池的底层实现,作为一个有追求的开发者,不仅知其然也要知其所以然,同时这一部分也是许多大厂面试的必问题目。本篇我们一起来走进线程池的源码一探究竟。1. 构造参数// 当我们使用 Executors 工具/工厂类创建线程池时,不管是使用下面三种...

2020-04-17 14:04:58 396

原创 AQS 源码解读系列--CyclicBarrier 篇

栅栏

2020-04-10 21:23:00 164

原创 AQS 源码解读系列--CountDownLatch 篇

CountDownLatch 作为 JUC 中提供的计数器。

2020-04-09 15:45:04 158

原创 AQS 源码解读系列--Semaphore 篇

本篇我们一起进入 Semaphore 的实现原理。

2020-04-09 15:02:27 137

原创 AQS 源码解读系列--ReentrantReadWriteLock 篇

1. readLock1.1. lock()1.2. unlock()2. writeLock2.1. lock()2.2. unlock()

2020-04-08 21:39:01 174

原创 AQS 源码解读系列--Condition 篇

上一篇我们解读了 ReentrantLock 的工作原理,ReentrantLock 作为 synchronized 关键字的替代,相对应的线程的通信 wait/notify/notifyAll 也有其替代,这就是 AQS 体系中的 Condition,本篇我们一起来了解一下 Condition 是如何工作的。1. await() 方法...

2020-04-03 10:51:34 178

原创 AQS 源码解读系列--ReentrantLock 篇

在 JDK1.6 之前,JDK 中实现同步我们只能使用 synchronized 关键字,尽管从 JDK1.5 开始 Java 官方对重量级的 synchronized 进行了升级,引入了偏向锁及自旋锁,使得语言层面的锁更加的轻量和高效,但是始终不能满足用户对锁灵活控制的需求,所以才有了 ReentrantLock 的出现。1. lock1.1 时序图1.2 源码解读Reentran...

2020-03-29 17:33:34 235

空空如也

空空如也

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

TA关注的人

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