自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 设计模式总结

定义另一个接口和对应的一组实现类,对所有目标分别定义一个访问接口,每个访问者实现类都是一个操作维度,实现所有目标的操作细节。多个观察者类实现相同的抽象接口,并注册到被观察者中,被观察者以调用抽象接口的形式,循环调用这些观察者。将实体的不同维度分离并抽象,将一个维度作为另一个维度的属性进行方法调用,以实现维度叠加的组合功能。通过一个新的类,专门用来创建某一类对象,他们一般使用了多态的特性,是一个接口和对应的一批实现类。定义一个接口和一组对应实现类,在新类中注册这些实现类并循环调用他们,调用成功就退出。

2023-06-18 13:45:48 1246

原创 mac安装homebrew

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)",

2021-11-12 22:46:20 513 5

原创 redis——缓存雪崩、缓存击穿、缓存穿透

redis——缓存雪崩、缓存击穿、缓存穿透雪崩、击穿、穿透都是因为缓存没有承担请求压力,而导致数据库请求压力增大的结果,只不过“失职”的原因不同1、缓存雪崩概念缓存雪崩是由于大量缓存同时失效,读请求的压力在一瞬间从缓存转移到数据库缓存失效可能的原因有两个:大量缓存同时过期缓存集群整体崩溃解决方案针对相同过期时间的数据,对过期时间设置一个较小的随机数在发生雪崩时对该请求进行熔断或降级构建缓存集群高可用2、缓存击穿概念少量热点数据失效,使读请求的压力在一瞬间从缓存转移到数据

2021-09-20 09:49:51 325

原创 Spring原理解读——事务传播行为

Spring原理解读——事务传播行为写在前面不要使用junit等测试方法测试事务,spring会自动回滚事务不要把不同事务写在同一个类里,这样无法打到事务嵌套的测试效果请手动回滚,不要尝试向上层抛出异常准备工作maven依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter

2021-09-14 22:31:58 330

原创 Spring源码解读——启动流程refresh

Spring源码解读——启动流程准备工作maven依赖<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.7</version></dependency>一个普通类public class TestBean {}

2021-09-13 16:30:36 308

原创 JVM原理解读-CMS垃圾回收流程

JVM原理解读-CMS垃圾回收流程1、初始标记单线程STW标记GC Roots可达的老年代对象遍历新生代对象,标记可达的老年代对象GC Roots虚拟机栈中引用的对象方法区中类静态属性引用的对象方法区中敞亮引用的对象本地方法栈中JNI引用的对象2、并发标记顺着初始标记的对象递归找出所有存活的对象,并标记老年代存活的对象监听已经过扫描的对象中有变动的对象,并标记对象所在的块为dirty,变动的途径包括:从新生代晋升到老年代的对象:cms虽然会同时扫描新生代和老年代的对象,

2021-09-06 15:51:00 253

原创 redis——集群

redis——集群为保证服务高可用,一般会对服务进行多节点分布式部署,redis有主从、哨兵、切片集群几种模式,这几种模式可以共存1、主从集群在slaver的redis.conf中添加主节点地址主节点ip 主节点端口1.1、同步过程slaver向master发送psync,传递runID(第一次为?,后面为主库runID)和offset(第一次为-1,后面为从库的复制进度)master回复fullresync,表示第一次全量复制master执行bgsave生成rdb文件,发给slave

2021-06-25 01:40:57 138

原创 redis——持久化

redis——持久化redis将数据放到内存中,提供高效的缓存能力,但是一旦宕机就会导致数据丢失,如果你需要重启后恢复缓存,就要在缓存时持久化数据1、AOF(Append Only File)在一条指令执行完成后再进行持久化,记录的是执行的指令1.1、优缺点优点:先执行指令再持久化,避免持久化时检查指令的额外开销缺点1:执行完指令就宕机,没来得及记日志,会导致该条缓存丢失缺点2:redis单线程,持久化操作会阻塞后续指令的执行1.2、持久化策略开启AOFappendonly yes

2021-06-24 13:57:09 157

原创 rocketmq——事务

rocketmq——事务rocketmq支持事务消息,两阶段提交,保证生产者生产消息,broker持久化消息的原子性1、生产者1.1、发送事务消息发送事务消息好像只能是同步的调用DefaultMQProducerImpl#sendMessageInTransaction()public TransactionSendResult sendMessageInTransaction(final Message msg, final LocalTransactionExecuter

2021-06-21 14:48:13 603

原创 rocketmq——消息的发送、存储、接收

rocketmq——消息的发送、存储、接收1、生产者生产消息并发送给broker1.1、启动流程public void start(final boolean startFactory) throws MQClientException { //将实例名改成pid if (!this.defaultMQProducer.getProducerGroup().equals(MixAll.CLIENT_INNER_PRODUCER_GROUP)) { t

2021-06-19 01:01:23 585

原创 rocketmq——Broker

rocketmq——Broker1、作用broker是一个单独的服务,提供消息的转发和存储功能2、启动流程启动流程分为两步,public static void main(String[] args) { start(createBrokerController(args)); }2.1、创建BrokerControllerpublic static BrokerController createBrokerController(String[] args) {

2021-06-16 11:17:31 1018

原创 rocketmq——NameServer

rocketmq——NameServer1、作用NameServer是一个单独的服务,作为rocketmq这一整套微服务的注册中心,提供broker信息的管理和生产者消费者的请求路由2、启动流程首先下载好rocketmq的源码https://github.com/apache/rocketmq我们进入到namesrv这个工程里,找到org.apache.rocketmq.namesrv下的NamesrvStartup类这个是启动方法:public static void main(Strin

2021-06-07 15:38:04 462 2

原创 rocketmq——入门

rocketmq——入门1、介绍​ rocketmq是一款阿里出的消息队列,java语言开发,目前交由apache开源,据说阿里内部大规模部署​ 数据显示rocketmq的qps能达到10万级,跟rabbitmq性能差不多但是社区比rabbitmq活跃,比kafka性能低一点但是响应比kafka快2、架构组成一般分为NameServer、Broker、Producer、Consumer2.1、Broker负责消息的接收、存储和发送2.2、NameServer负责管理broker的注册

2021-06-06 14:29:56 441

原创 nacos升级spring cloud 2020.0无法使用bootstrap.yml的问题

之前用spring cloud整合nacos,需要一个bootstrap.yml作为spring启动的初始化配置bootstrap.yml内容大概如下:spring: application: # 应用名称 name: xxx profiles: active: dev cloud: nacos: config: file-extension: yml server-addr: localhost:8848

2021-05-25 10:58:31 1516 8

原创 docker安装容器指令集

sonarqubedocker run -d --name sonarqube --link postgres -p 9000:9000 -e sonar.jdbc.url=jdbc:postgresql://docker.for.mac.host.internal:5432/sonar -e sonar.jdbc.username=root -e sonar.jdbc.password=123456 sonarqubepostgresdocker run --name postgres -e PO

2021-05-11 10:17:22 392

原创 构建sentinel-dashboard的docker镜像

官方已经出1.8.1了,但是docker hub上还停留在1.8.0,于是想自己通过jar包生成镜像1、下载sentinel-dashboard的jar包https://github.com/alibaba/Sentinel/releases/download/1.8.1/sentinel-dashboard-1.8.1.jar2、在与jar包同级目录下创建dockerfileFROM openjdk:11MAINTAINER cyliu1996 <[email protected]

2021-05-10 09:05:28 603 3

原创 数据结构与算法——位图

数据结构与算法——位图将原本存储byte、short、int、long这种固定长度(1字节、2字节、4字节、8字节)基本类型的整数类型,分割成固定二进制位数(8位、16位、32位、64位),每一位0、1表示某个数是否存在public class MyBitMap { private int[] datas; public MyBitMap(int maxNum) { datas = new int[maxNum / 32 + 1]; } public

2021-04-16 11:17:31 286 5

原创 数据结构与算法——AC自动机

数据结构与算法——AC自动机是一种基于Trie树的多模式匹配算法每个节点包括字符数据、是否是尾部字符、以及失效指针在Trie的基础上,通过失效指针,同时扫描多个模式串,避免相同前缀的重复回溯public class AcAutomation { private static class AcTreeNode { /** * 数据 */ Character data; /** * 子节点

2021-04-13 01:10:19 236 2

原创 数据结构与算法——Trie树(字典树)

数据结构与算法——Trie树(字典树)1、概念Trie树也叫字典树,是树形结构的一种,主要用于查找在一组字符串中是否有完全匹配给定字符串的字符串2、特点结构组成由于Trie不是二叉树,无法使用左右子节点存储映射关系,所以要用长度大于字符串字符集合范围的数组来存储映射关系Trie树的每个节点包含:数据、子节点集合、是否为某个字符串的结尾优势在前缀重合较多的字符串数组中,只要字典树构建完成,搜索速度会提升劣势内存消耗大:由于字典树的结构特点,导致需要初始化的数组很大但是存储数据的索引

2021-04-12 14:16:56 403 2

原创 数据结构与算法——字符串匹配

数据结构与算法——字符串匹配简单测了下,应该没啥问题,思路肯定没问题,代码如果有问题欢迎指正1、概念模式串:你需要匹配的字符串主串:作为被匹配范围的主体字符串2、BF算法如果【模式串】长度为n,那就从【主串】的第一个字符开始,比较【长度为n的子串】和【模式串】是否匹配,不匹配就再从第二个字符开始,直到匹配到模式串/** * BF算法 * * @param main 主串 * @param pattern 模式串 * @return

2021-04-10 21:51:03 446 1

原创 数据结构与算法——图

数据结构与算法——图1、组成顶点:图中的元素边:表示两顶点之间有直接联系度:一个顶点拥有边的个数无向图:没有方向的图,两顶点之间拥有边及两顶点相互关联有向图:有方向的图,A指向B顶点,只能表示A向B建立了关系入度:有向图中,被建立关系的边的条数出度:有向图中,与其他顶点建立的边的条数带权图:一个顶点的若干边带有权重的图2、存储方法邻接矩阵:查询效率高,但是浪费空间,因为不管两个节点有没有关系,他们之间的关系都会被存储邻接表:查询效率较低,但是省空间3、实现无向图publ

2021-04-01 00:43:06 95

原创 数据结构与算法——二叉树

数据结构与算法——二叉树1、概念父节点:当前节点的上一个节点子节点:当前节点的下一个节点(二叉树有左右两个子节点)兄弟节点:拥有同一个父节点的若干节点根节点:没有父节点的节点叶子节点:没有子节点的节点层:根节点的层数为1,子节点的层数为2,以此类推高度:最底层叶子节点的高度为0,父节点所在层高度为1,以此类推深度:高度的逆序,根节点深度为0,子节点深度为1,以此类推2、特殊类型满二叉树:除了叶子节点,每个节点都有左右两个子节点完全二叉树:除了最后一个非叶子节点的子节点可能只有

2021-03-30 15:17:52 80

原创 数据结构与算法——跳表

数据结构与算法——跳表跳表类似链表,也是一种支持动态操作的数据结构跳表每层选取若干节点作为索引创建到上层,这样自顶向下寻路时会比链表少遍历很多节点package com.lcy.data_structure_and_algorithm;import java.security.SecureRandom;public class MySkipList<E> { private static class Node<E> { /**

2021-03-25 14:08:45 156

原创 数据结构与算法——二分查找

数据结构与算法——二分查找二分查找对有序数组进行查找,循环将待查找的值与数组中点值比较,并缩小值所在范围,直到找到值1、常规二分查找public class BinarySearch { public static void main(String[] args) { final SecureRandom random = new SecureRandom(); final int[] arr = new int[100]; for (int

2021-03-23 17:49:24 129

原创 数据结构与算法——线性排序

数据结构与算法——线性排序1、桶排序遍历数组并将值放入指定范围的桶中,对桶内的元素进行排序这些桶的范围是有序排列的,所以合并数据时只要依次遍历桶内数据即可桶排序适合数据范围不大的数据public class BucketSort { private static class Bucket{ int tail; int[] data; public Bucket(int[] data) { this.data = d

2021-03-23 10:21:38 172 1

原创 数据结构与算法——非线性排序

数据结构与算法——非线性排序1、冒泡排序以升序为例每次循环都从头开始,若当前元素比下一个元素大,就交换冒泡排序无需额外空间,是原地排序算法,空间复杂度为O(1)O(1)O(1),平均时间复杂度为O(n2)O(n^2)O(n2)public class BubbleSort { public static void sort(int[] arr){ for (int i=0;i<arr.length-1;i++){ for (int j=0;j

2021-03-22 14:26:33 529

原创 数据结构与算法——队列

数据结构与算法——队列1、特点1.1、先进先出先入队的元素先出队1.2、一端进一端出从一端进入队列的元素,从另一端出队2、其他3.1、顺序队列package com.lcy.data_structure_and_algorithm;public class MyArrayQueue<E> { private Object[] elementData; private int size; /** * 头指针,下一个出队元素的索引

2021-03-18 22:48:33 126

原创 网络协议——RPC协议

网络协议——RPC协议远程调用协议,用于定义服务之间的接口调用规范标准1、RPC调用标准1.1、RPC结构客户端(服务端):执行逻辑进行本地调用Stub:对参数进行封装/解封装RPCRuntime:发送/接收请求/响应1.2、ONC RPC最早的RPC框架之一1.2.1、外部数据表示法(XDR)规定交互协议的文件,包括:XID:一对请求/响应的唯一标识CALL:请求为0,响应为1RPC Version:RPC协议的版本号Program Number:服务端程序的编号Ve

2021-02-25 17:33:27 1603

原创 网络协议——网络架构

网络协议——网络架构很抱歉懒了没有网络拓扑图1、对等网络(P2P)在加入p2p网络占用网络参与者的带宽获取文件的同时,也提供带宽供其他下载相同文件的参与者,下载自己已下载的文件片段主要解决单台服务器带宽压力内容分发协议之BitTorrent协议后缀.torrent,俗称BT种子文件,主要用来提供哪些参与者拥有哪些资源,由以下信息组成announce:tracker服务器地址,tracker服务器主要提供其他参与者的地址列表info区:表示该种子有几个文件段、文件有多大、目录结构、文件名字

2021-02-25 17:32:54 1299

原创 网络协议——应用层

网络协议——应用层1、超文本传输协议(HTTP)基于TCP/IP的应用层协议1.1、http请求1.1.1、请求行方法:GET、POST、PUT、DELETE等URL:http://www.163.com版本:HTTP 1.1、HTTP 2.01.1.2、首部就是请求头,例如Accept-Charset、Content-Type、Cache-Control、If-Modified-Since1.1.3、正文实体正式的数据报文1.1.4、http请求的发送客户端发送请求,应用

2021-02-25 17:32:23 325

原创 网络协议——传输层

网络协议——传输层提供端到端的连接方式1、用户数据报协议UDP不建立连接,直接发送简单的报文结构,不关心报文是否到达、网络是否阻塞使用场景对处理速度有要求、丢包不敏感的应用如应用层的DHCP、TFTP、QUIC、RTMP、Thread、GTP-U等,都是基于UDP的协议1.1、udp头结构源端口号、目的端口号、UDP长度、UDP校验和2、传输控制协议TCP建立可靠的连接发送报文2.1、报文格式与UDP相比,TCP在报文中增加了很多字段保证可靠传输包的序号(seq):保证包的先后

2021-02-25 17:31:52 129

原创 网络协议——网络层

网络协议——网络层1、网际互联协议IP1.1、5类地址IP地址有32位,由地址类型、网络号和主机号3部分组成,每类地址中都有一段地址为私有IP地址段,由每个域网内自由分配结构范围私有IP地址段用途A类0+7位网络号+24位主机号0.0.0.0~127.255.255.25510.0.0.0~10.255.255.255一般用于大型网络B类10+14位网络号+16位主机号128.0.0.0~191.255.255.255172.16.0.0~172.31

2021-02-25 17:31:23 182

原创 网络协议——数据链路层

网络协议——数据链路层也叫媒体访问控制层或MAC层,作用是将物理层的数据安全可靠地传给网络层,依靠交换机等硬件设备支撑1、数据链路控制通过多路访问协议,解决多个节点的数据同时到达同一节点发生的帧碰撞的问题1.1、信道划分协议时分复用(TDMA):把时间域划分成多个固定长度的时间段,安排每个时间段对应传输一个节点的数据,从物理上看还是轮流占用信道,类似操作系统的线程调度频分复用(FDMA):将信道分成若干子信道,并给配个节点分配一个专门的子信道用来传数据码分复用(CDMA):发送方将数据编码

2021-02-25 17:30:40 513

原创 计算机组成原理解读——存储器

计算机组成原理解读——存储器1、高速缓存存储器的速度和价格是成正比的,为了在速度和价格中间找一个平衡点,将经常访问的数据存在缓存,对比直接访问内存提高了访问速度CPU的高速缓存由快到慢为:L1、L2、L31.1、局部性原理时间局部性如果一条数据被访问了,那它在短时间内很有可能会被再次访问空间局部性如果一条数据被访问了,那它相邻的数据很有可能会被立刻访问1.2、直接映射(Direct Mapped Cache)确保内存地址和缓存地址1对1关系的策略,叫直接映射1.2.1、CPU缓存的数

2021-01-26 21:40:24 681

原创 计算机组成原理解读——CPU

计算机原理解读——CPUCPU全名Central Processing Unit,又叫中央处理器,主要由运算器和控制器组成1、门电路CPU属于超大规模集成电路,CPU就是电路1.1、基础门电路基础门电路是实现基础逻辑运算的门电路基础门电路主要有:与、或、非、或非、异或、与非1.2、算术逻辑单元(ALU)也叫操作元件(组合逻辑元件),他是在执行指令阶段,进行算数运算和逻辑运算的组合逻辑电路ALU包括基础门电路实现的逻辑运算,以及由基础门电路组合成的算术运算,如:半加器:与+异或全加器

2021-01-19 17:16:44 1609

原创 设计模式——行为型之状态模式

设计模式——行为型之状态模式将操作实例状态的行为封装成类,通过“状态类”主动调用改变对象状态,这样的行为叫状态模式状态模式适用于根据不同条件修改实例中某一成员变量的情景,将各个条件下复杂的修改逻辑单独提取出来,便于维护多说一句,实例的状态你可以理解成类的成员变量状态模式由3部分组成:上下文类,被修改的实例对应的类状态抽象类,将修改状态的行为抽象出来状态类,实现状态类,执行具体的修改实例状态的类上下文类:public class Context { private IStat

2021-01-14 10:53:46 134

原创 设计模式——行为型之中介者模式

设计模式——行为型之中介者模式将服务提供方的接口重新封装成一个新类,服务调用方通过新类的方法间接调用原始接口,这样的行为叫中介者模式中介者模式适合多个不同类型的一类实例互相调用的情况,将调用和执行解耦,实际上是调用者将请求委托给中介者调用中介者模式由3部分组成:调用者/接收者的抽象类,抽象出不同接收者的相同点调用者/接收者,实现具体的执行逻辑中介者,代替调用者调用接收者抽象类:public abstract class IObject { protected Mediator

2021-01-14 10:53:28 141

原创 设计模式——行为型之责任链模式

设计模式——行为型之责任链模式将服务提供方分解为若干有序步骤,并指定后继连成链表,这种程序执行逻辑的行为叫责任链模式责任链模式将服务的提供和调用解耦,同时使服务提供方便于动态增减处理步骤,增强了可扩展性责任链模式由3部分组成:责任链类,负责串联起所有处理器,并暴露执行入口处理器抽象类,将处理器的行为抽象,便于链上各个步骤的维护链上的处理器类,执行服务分解后,具体每一步的处理逻辑责任链类:public class HandleChain { private AbstractHa

2021-01-13 23:40:04 263 2

原创 设计模式——行为型之模版模式

设计模式——行为型之模版模式将一个方法的逻辑拆分为多个步骤,由不同子类实现自己各个步骤的逻辑,这样的类的行为叫模版模式模版模式将相同实现抽离,将不同实现延迟到子类,使通用逻辑和特殊逻辑解耦模版模式由2部分组成:抽象模版类,将统一接口拆分成若干步骤实现类,各个子类根据自己的需要实现各个步骤抽象模版类:public abstract class AbstractTemplate { //final修饰避免被重写 public final void templateMethod

2021-01-13 23:39:34 69

原创 设计模式——行为型之命令模式

设计模式——行为型之命令模式将逻辑完全无关的若干行为,封装成一个个对象,由服务提供者暴露出一个统一的接口无差别调用,这样的行为叫命令模式命令模式将函数封装成对象并作为参数传递,将请求和调用解耦命令模式一般用于执行过程和结果不确定的动作,例如队列(方法执行的顺序不确定)命令模式由三部分组成:命令抽象类,提供命令的抽象执行入口命令类,实现抽象类的执行方法,也就是逻辑无关的各个行为执行类,执行命令接下来简单实现一个队列命令抽象类:public interface Command {

2021-01-13 23:39:03 128

空空如也

空空如也

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

TA关注的人

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