自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 「Kafka」监控、集成篇

Kafka-Eagle 监控、Kafka-Kraft 模式、Kafka 集成 Flume、Kafka 集成 Flink、Kafka 集成 SpringBoot、Kafka 集成 Spark 等内容,

2024-02-23 11:09:34 1150 2

原创 「Kafka」消费者篇

Kafka 消费方式、Kafka 消费者工作流程、生产经验—分区的分配以及再平衡、offset 位移、生产经验—消费者事务、生产经验—数据积压(消费者如何提高吞吐量)等内容。

2024-02-04 11:44:58 1500

原创 「Kafka」Broker篇

Kafka存储数据、Zookeeper 在 Kafka 中的作用、Broker 总体工作流程、节点服役和退役、Kafka 副本 Leader 选举、Leader 和 Follower 故障处理细节、文件存储、高效读写等。

2024-01-16 16:44:56 1264

原创 蓝桥杯AcWing学习笔记 9-2复杂DP的学习(下)

复杂DP(下)非传统DP问题思考方式,全新的DP思考方式:从集合角度来分析DP问题——闫式DP分析法例题AcWing 1303. 斐波那契前 n 项和矩阵乘法+快速幂此题并非dp问题,是为了后面的蓝桥杯真题铺垫知识点。矩阵乘法:矩阵乘法是有结合律的,所以可以用快速幂来求。接下来构造我们本题的矩阵。第八届2017年蓝桥杯真题完全背包问题朴素做法优化做法AcWing 1226. 包子凑数JavaB组第8题完全背包问题+数论

2024-01-16 10:37:09 1075

原创 蓝桥杯AcWing学习笔记 9-1复杂DP的学习(上)

复杂DP(上)非传统DP问题思考方式,全新的DP思考方式:从集合角度来分析DP问题——闫式DP分析法例题AcWing 1050. 鸣人的影分身整数划分的变形题。M个查克拉,N个影分身,当7个查克拉分配在3个影分身的时候,可以有8种方案。暴搜dfs(AC)相当于是m个球,放n个盒子,每个盒子最少放0个球的问题暴力枚举每个盒子放多少个球,为了方便从左到右的球的数量从小到大递增,dfs过程中需要添加多start作为开始枚举的位置。闫式DP分析法(AC)时间复杂度 O(N^2)。

2024-01-15 10:53:02 887

原创 蓝桥杯AcWing学习笔记 8-2数论的学习(下)

数论(下)蓝桥杯省赛中考的数论不是很多,这里讲几个蓝桥杯常考的知识点。约数个数定理:我们如何去求一个数的约数个数呢?约数和定理。例题AcWing 1296. 聪明的燕姿约数个数定理约数和定理给我们一个S,问我们有多少个正整数满足它的所有正约数之和等于S。S满足约数和定理。因为方案数非常少,我们可以用暴搜dfs求解。

2024-01-14 17:38:53 970

原创 蓝桥杯AcWing学习笔记 8-1数论的学习(上)

数论(上)蓝桥杯省赛中考的数论不是很多,这里讲几个蓝桥杯常考的知识点。欧几里得算法——辗转相除法。算术基本定理:就是因式分解的定理,所有的整数都可以唯一分解成若干个质因子乘积的形式。筛法求素数——线性筛法(欧拉筛法)在 O(N) 的时间复杂度内,求出来 1 ~ n 中所有的质数,以及每一个数的最小质因子。① 筛掉的一定是合数,且一定是用其最小质因子筛的② 合数一定会被筛掉这样我们就可以把所有质数找出来,而且每个和数只会被最小质因子筛,所以每个和数只会被筛一次,所以整个算法的时间复杂度为 O(N)。

2024-01-13 13:48:28 1036

原创 「Kafka」生产者篇

生产者发送消息流程、生产者分区、生产者如何提高吞吐量、生产者数据可靠性、生产者数据去重、生产者数据有序乱序等。

2023-12-28 18:46:41 1096

原创 「Kafka」入门篇

基础架构、集群部署、命令行操作。

2023-12-27 12:08:45 951

原创 【Go语言从入门到实战】反射编程、Unsafe篇

反射编程、利用反射构造万能程序、不安全编程 - UnSafe。

2023-11-24 13:30:19 557

原创 雪花算法 — 集群高并发情况下如何保证分布式唯一全局ID生成?

Twitter的分布式自增ID算法——Snowflake。最初Twitter把存储系统从MySQL迁移到Cassandra(由Facebook开发的一套开源分布式NoSQL数据库系统),因为Cassandra没有顺序ID生成机制,所有开发了这样一套全局唯一ID生成服务。Twitter的分布式雪花算法SnowFlake,经测试SnowFlake每秒可以产生26万个自增可排序的ID。Twitter的SnowFlake生成ID能够按照时间有序生成。

2023-07-13 13:42:11 1299 1

原创 【Go语言从入门到实战】并发篇

并发篇:协程、共享内存并发机制、CSP并发机制(Channel)、多路选择和超时控制、channel的关闭和广播、任务的取消、Context、并发任务(单例模式、仅需任意任务完成、所有任务完成、对象池、sync.Pool 对象缓存)另外还有单元测试的内容。

2023-05-28 21:22:07 1339

原创 【Go语言从入门到实战】面向对象编程篇

面向对象编程篇:封装数据和行为(结构体、行为定义)、接口interface、自定义类型、扩展和复用(类似继承)、匿名嵌套类型、多态、空接口、断言。另外文章还有:错误机制(error、panic、revocer)、包package、依赖管理的知识。

2023-05-26 14:06:27 1276

原创 【Go语言从入门到实战】基础篇

基础篇:HelloWorld、Test、变量常量、数据类型、运算符、循环、条件、数组、切片、Map、字符串、函数。

2023-05-24 20:15:49 2373

原创 设计模式_自定义Spring框架(IOC)

首先我们有一个 BeanFactory 顶级父接口,定义统一的规范;然后我们再搞一个 ApplicationContext 接口继承 BeanFactory,目的就是为了实现非延时加载 BD 对象;然后创建一个 AbstractApplicationContext 子实现类它主要实现非延加载时的功能,也就是 refresh() 方法,它调用了 XmlBeanDefinitionReader#loadBeanDefinitions 方法,这个方法可以加载并解析 xml 文件,将所有 bean 标签封装为

2023-01-23 12:22:02 1346

原创 设计模式_行为型模式 -《迭代器模式》

迭代器模式 (Iterator Pattern) 主要包含以下角色:抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。具体聚合(Concrete Aggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、next() 等方法。具体迭代器(Concrete lterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。

2023-01-22 13:08:47 1476

原创 设计模式_行为型模式 -《观察者模式》

观察者模式 (Observer Pattern) 中有如下角色:Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。Observer:抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。

2023-01-20 11:04:57 1450

原创 设计模式_行为型模式 -《责任链模式》

责任链模式 (Chain of Responsibility Pattern) 主要包含以下角色:抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接(下一个对象的引用)。具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。现需要开发一个请假流程控制系统。请假

2023-01-19 11:33:00 1519

原创 设计模式_行为型模式 -《策略模式》

策略模式 (Strategy Pattern) 的主要角色如下:抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。环境(Context)类:持有一个策略类的引用,最终给客户端调用。【例】促销活动一家百货公司在定年度的促销活动。针对不同的节日(春节、中秋节、圣诞节)推出不同的促销活动,由促销员将促销活动展示给客户。类图如下:

2023-01-18 12:15:24 507

原创 设计模式_行为型模式 -《模板方法模式》

模板方法模式 (Template Method Pattern) 包含以下主要角色:抽象类(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。基本方法:是实现算法各个步骤的方法,是模板方法的组成部分。基本方法又可以分为三种:抽象方法(Abstract Method):一个抽象方法由抽象类声明、由其具体子类实现。具体方法(Concrete Method):一个具体方法由一个抽象类或具体类声明

2023-01-17 11:57:09 415

原创 设计模式_结构型模式 -《装饰器模式》

装饰器模式 (Decorator Pattern) 中的角色:抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。具体构件(Concrete Component)角色:实现抽象构件,通过装饰角色为其添加一些职责。抽象装饰(Decorator)角色:继承或实现抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。这个角色就是装饰者。具体装饰(Concrete Decorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

2023-01-16 10:57:08 376

原创 设计模式_结构型模式 -《适配器模式》

适配器模式 (Adapter Pattern) 包含以下主要角色:目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。实现方式:定义一个适配器类来实现当前系统的业务接口,同时又继承现有组件库中已经存在的组件。【例】读卡器现有一台电脑只能读取 SD 卡,而要读取 TF 卡中的

2023-01-15 14:35:39 441

原创 设计模式_结构型模式 -《代理模式》

代理模式 (Proxy Pattern) :由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。Java 中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理类在编译期就生成而动态代理代理类则是在 Java 运行时动态生成。动态代理又有:JDK 代理CGLib 代理代理(Proxy)模式分为三种角色:抽象主题(Subject)类: 通过接口或抽象类声明真实主题和代理对象实现的业务方法。

2023-01-14 13:38:48 464

原创 设计模式_创建型模式 -《建造者模式》

建造者模式 (Builder Pattern) 包含如下角色:抽象建造者类(Builder):这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的部件对象的创建。 具体建造者类(ConcreteBuilder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例。 产品类(Produc* 产品类(Product):要创建的复杂对象。* 指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责

2023-01-13 10:25:26 263

原创 设计模式_创建型模式 -《原型模式》

原型模式 (Prototype Pattern) :用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。结构原型模式包含如下角色:抽象原型类:规定了具体原型对象必须实现的的 clone() 方法。具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。访问类:使用具体原型类中的 clone() 方法来复制新的对象。原型模式的克隆分为浅克隆和深克隆。浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象

2023-01-12 14:16:38 388

原创 设计模式_创建型模式 -《工厂模式》

在 java 中,万物皆对象,这些对象都需要创建,如果创建的时候直接 new 该对象,就会对该对象耦合严重,假如我们要更换对象,所有 new 对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则。如果我们使用工厂来生产对象,我们就只和工厂打交道就可以了,彻底和对象解耦,如果要更换对象,直接在工厂里更换该对象即可,达到了与对象解耦的目的;所以说,工厂模式 (Factory Pattern) 最大的优点就是:解耦。在本教程中会介绍三种工厂的使用:简单工厂模式(不属于 GOF 的 23 种经典设计模式)

2023-01-11 11:12:48 228

原创 设计模式_创建型模式 -《单例模式》

创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。单例模式 (Singleton Pattern) 是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。单例模式的主要有以下角色:单例类:只能创建一个实例的

2023-01-10 11:43:50 167

原创 线程池 - ThreadPoolExecutor 详解

线程池:一个容纳多个线程的容器,容器中的线程可以重复使用,省去了频繁创建和销毁线程对象的操作。降低资源消耗,减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。提高响应速度,当任务到达时,如果有线程可以直接用,不会出现系统僵死。提高线程的可管理性,如果无限制的创建线程,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。线程复用,同一个线程可以被重复使用,来处理多个任务。池化技术 (Pool) :一种编程技巧,核心思想是资源复用,在请求量大时能优化应用

2023-01-08 20:21:56 668

原创 ConcurrentSkipListMap-跳跃表 源码解析

跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。最底层的节点,每一个都是 Node 节点,按照 key 升序排序。而上方具有等级的节点,是索引节点,上图的跳跃表是具有 3 层索引的跳跃表,第一层 level-1 的索引密度最大,第二层 level-2 是对一层索引的索引,第三层 level

2022-12-28 12:53:43 674

原创 Redis原理篇—内存回收

内存过期策略-过期key处理Redis 之所以性能强,最主要的原因就是基于内存存储。然而单节点的 Redis 其内存大小不宜过大,会影响持久化或主从同步性能。我们可以通过修改配置文件来设置 Redis 的最大内存当内存使用达到上限时,就无法存储更多数据了。为了解决这个问题,Redis 提供了一些策略实现内存回收:内存过期策略内存淘汰策略在学习 Redis 缓存的时候我们说过,可以通过 expire 命令给 Redis 的 key 设置 TTL(存活时间)可以发现,当 key 的 TTL

2022-12-27 10:37:25 835

原创 Redis原理篇—通信协议

RESP协议Redis 是一个 CS 架构的软件,通信一般分两步(不包括 pipeline 和 PubSub):客户端(client)向服务端(server)发送一条命令服务端解析并执行命令,返回响应结果给客户端因此客户端发送命令的格式、服务端响应结果的格式必须有一个规范,这个规范就是通信协议。而在 Redis 中采用的是 RESP(Redis Serialization Protocol)协议:Redis 1.2 版本引入了 RESP 协议Redis 2.0 版本中成为与 Redis

2022-12-26 12:33:52 558

原创 Redis原理篇—网络模型

用户空间和内核态空间服务器大多都采用 Linux 系统,这里我们以 Linux 为例来讲解:ubuntu 和 Centos 都是 Linux 的发行版,发行版可以看成对 Linux 包了一层壳,任何 Linux 发行版,其系统内核都是 Linux。我们的应用都需要通过 Linux 内核与硬件交互。用户的应用,比如 redis,mysql 等其实是没有办法去执行访问我们操作系统的硬件的,所以我们可以通过发行版的这个壳子去访问内核,再通过内核去访问计算机硬件。计算机硬件包括,如 cpu,内存,网卡等等

2022-12-25 12:55:14 1053 1

原创 Redis原理篇—数据结构

底层数据结构动态字符串SDS我们都知道 Redis 中保存的 Key 是字符串,value 往往是字符串或者字符串的集合。可见字符串是 Redis 中最常用的一种数据结构。不过 Redis 没有直接使用C语言中的字符串,因为C语言字符串存在很多问题:获取字符串长度的需要通过运算非二进制安全不可修改Redis 构建了一种新的字符串结构,称为简单动态字符串(Simple Dynamic String),简称 SDS。例如,我们执行命令:那么 Redis 将在底层创建两个 SDS,其中一个是包含

2022-12-24 15:45:51 738

原创 Redis高级篇之最佳实践

Key 的最佳实践[业务名]:[数据名]:[id]足够简短:不超过 44 字节不包含特殊字符Value 的最佳实践:合理的拆分数据,拒绝 BigKey选择合适数据结构Hash 结构的 entry 数量不要超过 1000(默认是 500,如果达到上限则底层会使用哈希表而不是 ZipList,内存占用较多)设置合理的超时时间批量处理的方案:原生的 M 操作Pipeline 批处理注意事项:批处理时不建议一次携带太多命令。Pipeline 的多个命令之间不具备原子性。

2022-12-23 11:59:32 925

原创 消息队列—RabbitMQ(万字详解)

在基于微服务开发的电商项目中,商品的查询和商品的修改是通过两个服务实现的,如果修改了商品的价格,如何保证商品查询服务查询出来的商品价格同步更新呢?同步调用➢ A服务调用B服务,需要等待B服务执行完毕的返回值,A服务才可以继续往下执行。和RPC(Dubbo)实现同步调用。异步调用➢ A服务调用B服务,而无需等待B服务的执行结果,也就是说在B服务执行的同时A服务可以继续往下执行。➢ 通过:消息队列实现异步调用。MQ全称为Message Queue,消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通

2022-12-22 12:07:39 4504

原创 WeakHashMap源码解析

WeakHashMap 是一种 弱引用 map,内部的 key 会存储为弱引用,当 jvm gc 的时候,如果这些 key 没有强引用存在的话,会被 gc 回收掉,下一次当我们操作 map 的时候会把对应的 Entry 整个删除掉,基于这种特性,WeakHashMap 特别适用于 缓存 处理。WeakHashMap 因为 gc 的时候会把没有强引用的 key 回收掉,所以注定了它里面的元素不会太多,因此也就不需要像 HashMap 那样元素多的时候转化为红黑树来处理了。因此,WeakHashMap 的

2022-12-21 11:34:23 386

原创 LinkedHashSet源码解析

上一节我们说 HashSet 中的元素是无序的,那么有没有什么办法保证 Set 中的元素是有序的呢?答案是当然可以。我们今天的主角 LinkedHashSet 就有这个功能,它是怎么实现有序的呢?让我们来一起学习吧。如果你已看过前面关于 HashSet 和 HashMap,一定能够想到本文将要讲解的 LinkedHashSet 和 LinkedHashMap 其实也是一回事,前者仅仅是对后者做了一层包装,也就是说 LinkedHashSet 里面有一个 LinkedHashMap(适配器模式)。

2022-12-20 15:00:25 355

原创 LinkedHashMap源码解析

LinkedHashMap 继承于 HashMap,其内部的 Entry 多了两个前驱、后继指针,内部额外维护了一个双向链表,能保证元素按插入的顺序访问,也能以访问顺序访问,可以用来实现 LRU 缓存策略。LinkedHashMap 实现了 Map 接口,即允许放入 key 为 null 的元素,也允许插入 value 为 null 的元素。LinkedHashMap 可以看成是 LinkedList + HashMap,从名字上可以看出该容器是 LinkedList 和 HashMap 的混合体,

2022-12-19 13:48:21 424

原创 HashTable源码解析

HashTable 是一个古老的(JDK1.0 时就已存在)线程安全的容器,其核心方法都是 synchronized 修饰的。相反 HashMap 不是线程安全的。从图中可以对比得出,二者都是源于 Map 接口,都实现了 Cloneable 和 Serializable接口,二者都可以克隆和序列化。但 HashMap 的父类是 AbstractMap,HashTable父类是 Dictionary。Dictionary 类是一个已经被废弃的类(见其源码中的注释)。父类被废弃,自然其子类 Has

2022-12-18 12:14:16 416

原创 HashSet源码解析

HashSet 是 Set 的一种实现方式,底层主要使用 HashMap 来确保元素不重复。对于 HashSet 和 HashMap,前者仅仅是对后者做了一层包装,也就是说 HashSet 里面有一个 HashMap(适配器模式)。HashSet 保证元素不重复的关键就在于这个 add() 方法;在 HashMap 中如果插入元素的 key 与当前桶位的 key 完全一致,则会认为这是一次替换操作,更新键值对的 value 值;而对于 HashSet 的实现,添加相同的 key 时,利用是否存

2022-12-17 13:40:16 534

空空如也

空空如也

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

TA关注的人

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