- 博客(38)
- 收藏
- 关注
原创 关于LeetCode中第三题的最长子串
这个就是滑动窗口的设计,需要两个指针left和right,其中每次搜索时left固定,然后向右移动right,只要出现重复的字符,就修改left的位置。可以用一个Map用来存储当前的子串,每次遇到重复的字符,都要把上一个字符的位置删掉,也就是把当前left指定的字符去掉,换成当前重复所在的位置。每当我们选择一个字符作为查询的开始之后,每次搜到的子串都要判断是否存在重复的字符,如果存在,那么当前开始的字符的最长子串就是确定的。这道题主要使用到的思路是。
2024-02-23 00:27:16
454
3
原创 Dubbo-SPI机制
SPI的全称是Service Provider Interface,是JDK内置的动态加载实现扩展点的机制,通过SPI可以动态获取接口的实现类,属于一种设计理念。系统设计的各个抽象,往往有很多不同的实现方案,在面向的对象的设计里,一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。如果代码中引用了特定的实现类,那么就违反了可插拔的原则。为了进行实现的替换,需要对代码进行修改。需要一种服务发现机制,以实现在模块装配时无需在程序中动态指定。最常见的使用案例有JDBC、Dubbo和Spring。笔者在代码
2023-10-12 22:31:03
678
原创 Debeizum 增量快照
1、快照机制在Debeizum1.6版本发布之后,成功推出了Incremental Snapshot(增量快照)的功能,同时取代了原有的实验性的Parallel Snapshot(并行快照)。在本篇博客中,我将介绍全新快照方式的原理,以及深入研究其实现细节。1、快照机制在以往的Debezium的中,我们需要借助其提供的Snapshot机制来获取数据源中的历史数据。
2023-07-30 16:16:06
1764
原创 Canal内存队列的设计
canal内存队列模拟了ringbuffer的实现,本质上是一个生产-消费模型的实现,所以在很多put、get和ack的操作存在对同一个型号量的await和signal操作。除此之外还需要不断保证ackSequence、putSequence和getSequence三者之间关系的保持和计算,对内存使用也有一定的限制。内存队列中的其他方法实现就不列举了(嘻嘻),详细可以看下下面老哥的博客介绍。
2023-05-21 17:19:33
897
原创 分析Canal如何支持MySQL主从同步
本文分析Canal如何模拟MySQL主从同步协议,并分析Binlog结构首先,Canal把自己伪造成一个slave,向Master注册自己的信息,这样Master才会向Canal发送Binlog信息。
2022-07-23 02:46:28
1716
原创 Eager Rebalance VS Incremental Cooperative Rebalance
本文将介绍Kafka Connect在组成集群时是如何交互的。
2022-05-22 16:39:49
236
原创 Netty中的EventExecutor
虽然NioEventLoop追朔到源头是继承了EventExector,但是两者在使用场景上有很大的区别。1、NioEventLoopNioEventLoop的主要y
2021-06-15 22:39:21
1489
原创 Netty中NioEventLoop的两个逻辑点分析
1、NioEventLoop中如何优化java原生的Selector在NioEventLoop的构造函数中,我们可以看到java原生的Selector并不是由SelectorProvider返回的,而是由内部的另外一个方法openSelector返回。 NioEventLoop(NioEventLoopGroup parent, Executor executor, SelectorProvider selectorProvider, SelectStrat
2021-05-23 18:14:11
304
原创 在Netty中使用FastThreadLocal代替ThreadLocal
FastThreadLocal相比较于ThreadLocal在FastThreadLocalThread有更好的表现,因为在FastThreadLocal是使用数组而不是像ThreadLocal那样使用hash code 以及hash table去查找对象。尽管看起来非常微妙,但它比使用哈希表产生了一些性能优势,并且在频繁访问时非常有用。为了使用FastThreadLocal带来的优势,你的线程类型应该使用FastThreadLocal以及它的子类,而不是使用Thread(下面会讲到原因)。因此在Net
2021-03-30 00:16:29
663
1
原创 在Spring中将ApplicationContextAware和代理设计模式结合
笔者在开发的时候遇到一个问题一个类中存在多个实现 需要提供一个窗口,让外部调用的时候无需知道众多子类的实现因为项目使用Spring开发的,所以笔者这里打算采用ApplicationContextAware提供的接口,获取到全部子类。并提供一个Proxy屏蔽这些子类的差异,让调用只通过Proxy完成。1、代理设计模式和策略设计模式区别这里说明下为啥不用策略设计模式而是选择代理设计模式,因为策略设计模式更趋向于实现一个目标的不同做法,例如我要对一系列数字进行排序,可以采用冒泡、希尔以及归并扽等等
2021-03-23 00:03:25
381
原创 关于Netty中的Recycler对象池
1、对象池的背景 Netty本身作为通信用的框架,消息的创建和处理十分频繁,但是大多数的消息本身可循环使用的程度不高,大部分都是创建完传输后就被等待GC了。但是考虑到大部分消息只是消息部分内容有所差异,可以考虑对创建消息的对象进行循环利用,减少创建和GC带来的消耗。2、Recycler图例...
2021-03-19 01:22:19
773
原创 CountDownLatch源码解析
文章只是简单记述下CountDownLatch的原理,看过AQS、ReentrantLock和ReentrantReadWriteLock的文章后,可以大致清楚了解和AQS相关工具的使用。CountDownLatch本身也是通过一个内部类Sync实现AQS,所以其构造方法内部也是实现如何去初始化这个Sync的过程。 public CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentExc
2020-12-05 23:39:53
260
1
原创 CyclicBarrier源码解析
和CountDownLatch不同,CyclicBarrier表示调用await方法之后,线程会阻塞知道,知道一定数目的线程执行了await之后才会全部唤醒。而且CyclicBarrier还有两个功能点,支持重复使用和唤醒时回调。所以我们需要第一步了解到CyclicBarried是如何等待多个线程等待并且一起唤醒的。1、初始化CyclicBarrierCyclicBarrier默认的初始化比较简单,parties表示需要等待多少个线程await后才唤醒。 public CyclicB
2020-12-05 23:39:27
271
原创 ReentrantReadWriteLock死锁问题解析
1、案情代码分析:private static ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true); public static void main(String[] args){ // thread a new Thread(() -> { System.out.println("a第一次获取读锁");
2020-10-22 00:14:12
1673
原创 ThreadLocal和维护全局Map<THread,Object>区别(摘自java并发编程实战3.3.3)
线程封闭作用: 当访问共享的可变数据时,通常需要使用同步。一种避免使用同步的方式就是不共享数据。如果仅在单线程内访问数据,就不需要同步。这种技术被称为线程封闭,它是实现线程安全性的最简单方式之一。当某个对象封闭在一个线程中时,这种用法将自动实现线程安全性,即使被封闭的对象本身不是线程安全的。 维持线程封闭性的一种更规范方法是使用ThreadLocal,这个类能使线程中的某个值与保存值的对象关联起来。ThreadLocal提供了get/set等访问接口或方法,这些方法为每个使...
2020-10-11 15:33:00
362
原创 ReentrantLock的非公平锁AQS队列实现
以下以ReentrantLock的NofaiySync分析AQS(又或者说CLH变种)的实现方式。1、尝试获取资源调用NofairSync的lock方法的时候,会先尝试对资源state加锁,失败的时候还会尝试获取锁。 final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread());
2020-09-24 23:56:57
993
原创 如何在Windows中开启多个Rabbitmq服务以及如何搭建单机伪集群
1、安装Eralng和Rabbitmq在电脑中,这点不用说,网上一大堆方法。(默认的端口时5672,服务的web时15672)2、由于是要在windows开启多个Rabbitmq服务,就不能在环境变量中设置RABBITMQ_NODE_PORT和RABBITMQ_NODENAME这两个属性,应该在环境配置文件中修改,以下一步步分解过来 2.1)复制安装目录下的sbin/的所有bat文件...
2018-12-02 23:34:06
2284
原创 java中的RabbitMq
1、创建连接到RabbitMq服务器的连接 在RabbitMq所有的操作都是在信道中完成的。信道是建立在真实的TCP连接内的虚拟连接,应用程序通过TCP连接到RabbitMQ,在TCP没有关闭的情况下再通过创建信道发送AMQP命令。每条信道都会有专门的唯一ID进行标记,这点RabbitMq会帮你记住。RabbitMq使用信道的原因(摘抄网上的,因为写的不错)1. TCP的创建和销...
2018-10-24 11:28:59
520
原创 基于Java的一个扫描路径下全部文件的程序
import java.io.File;import java.io.FilenameFilter;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.regex.Pattern;public class Directory { //处理多层文...
2018-08-10 17:30:01
1252
原创 Spring如何从客户端接收json数据以及如何发送json数据到客户端(一)
首先,Spring是没有自带json转换数据的包的,所有我们要自己导入json的包到类路径下,假如是使用Maven的话可以加入以下语句到pom.xml中,还有如果你是使用SpringBoot的话不用加json的包,SpringBoot 默认会使用 Json 作为响应报文格式。 Maven的添加包(采用gson的包) <dependency> ...
2018-06-05 15:41:34
3384
原创 配置gradle的远程仓库地址
在C:\Users\用户名\.gradle的目录下创建文件init.gradle并添加一下文字allprojects{ repositories { def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/' all { ArtifactRepository repo -> ...
2018-04-11 15:11:50
2712
原创 关于docker使用run命令加上参数-it时出现the input device is not a TTY. If you are using mintty, try prefixing the
最近在用docker时创建redis的镜像时,使用命令docker run -it --name redis-master redis /bin/bash出现问题the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'就算加上winpty在前缀,也出现问题/usr...
2018-03-29 10:24:55
17109
2
转载 nginx 常见正则匹配符号表示
1、^: 匹配字符串的开始位置; 2、 $:匹配字符串的结束位置; 3、.*: .匹配任意字符,*匹配数量0到正无穷; 4、\. 斜杠用来转义,\.匹配 . 特殊使用方法,记住记性了; 5、(值1|值2|值3|值4):或匹配模式,例:(jpg|gif|png|bmp)匹配jpg或gif或png或bmp 6、i不区分大小写一.正则表达式匹配,其中:* ~ 为区分大小写匹...
2018-03-26 14:50:21
10277
原创 springboot使用addViewController减少控制器代码的编写
最近模仿了sping-sagan项目的代码,感觉不错就打算一一记录下来import org.springframework.beans.factory.annotation.Autowired;import org.springframework.core.io.Resource;import org.springframework.core.io.support.ResourcePatter...
2018-03-15 22:31:34
14760
1
原创 golang使用filepath.Walk的时候路径不能使用\
在需要遍历路径中所有文件并且过滤的时候,golang提供了一个比较好的方法:func Walk(root string, walkFn WalkFunc) error但是这个方法第一个参数是root路径,传递路径的时候不能使用 \ 反斜杠符,而是要是用//代替路径分割符...
2018-03-15 10:34:56
2971
原创 SpringBoot访问不了resources/templates下的页面
最近在使用springboot开发一个项目,然后发现一直访问不了resources/templates下的页面,命名控制器代码也没有写错。然后自己加了@EnableWebMvc注解以及自己配置了视图解析器,到最后还是不能解决问题(可以发现配置了@EnableWebMvc后可以在控制台打印出页面的路径)。最后发现原来SpringBoot只支持模板引擎的原因。所以我认为可能是要加上一个模板引擎在依赖中...
2018-03-14 21:03:21
19721
4
转载 Maven POM中的各种scope的行为总结
compile:默认的scope。任何定义在compile scope下的依赖将会在所有的class paths下可用。maven工程会将其打包到最终的arifact中。如果你构建一个WAR类型的artefact,那么在compile scope下引用的JAR文件将会被集成到WAR文件内。provided:这个scope假定对应的依赖会由运行这个应用的JDK或者容器来提供。
2018-02-13 13:51:46
232
原创 nginx搭图片服务器
#user nobody;worker_processes 1;#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#pid logs/nginx.pid;events { worker_connections 1...
2018-02-10 09:27:55
261
转载 在一条sql语句中插入多个记录的
insert into tableName (列名1,列名2,列名3,列名4) select 值1,值2,值3,值4 union all select 值1,值2,值3,值4 union all select 值1,值2,值3,值4......INSERT INTO TABLE1 SELECT * FROM TABLE2 //从表2中查询到数据然后插入到TABLE1中
2018-02-03 16:46:59
1931
原创 关于linux防火墙开放端口问题
在liux安装postgresql的时候,防火墙开放端口是必须的,因为有时候数据库要允许外来访问,但是防火墙会禁止到外来IP的范文数据库,这里我已开启4000端口为例 命令 vim /etc/sysconfig/iptables里添加 -A INPUT -t tcp -m tcp --dport 4000 -j ACCEPT ,然后再重启防火墙 service iptables rest
2017-11-19 19:40:31
1639
原创 go语言如何将时间转化为字符串String类型
在golang中获取时间用time.Now().Unix() 由于是时间戳类型,所以我们这里用strconv.FormatInt()就可以了,后面的第二个参数我一直都写10,具体我也不知道什么意思,我就简单认为是转化的长度 go语言int转化为string有3中方法,strconv.Itoa() 使用在int32位的,大于32位,用strconv.FormatInt() ,还有就是fm
2017-11-19 19:35:38
7969
1
原创 linux下搭配go环境和安装beego
1、首先先下载go的SDK包到linux中,我这里下载的是Golang中国网站的的go1.9.2.linux-amd64.tar.gz包,解压到/usr/local/go的目录下 2、设置环境变量,执行 vim /etc/profile命令修改环境配置 export GOROOT=/usr/local/go/go1.9.2.linux-amd64 //G
2017-11-19 19:19:25
2212
1
转载 web.xml中的web-app中出现Attribute "xsi:schemaLocation" must be declared for element type "web-app".
如果web.xml的web-app的xmlns,xmlns:xsi,xsi:schemaLocation,同时出现Attribute "xxxx" must be declared for element type "web-app".,这时我们要删掉标签前面的注释
2017-09-19 20:57:45
1403
原创 在Eclipse编辑spring-boot出现问题
Plugin org.springframework.boot:spring-boot-maven-plugin:1.3.0.BUILD-SNAPSHOT or one of its dependencies could not be resolved: Could not find artifact org.springframework.boot:spring-boot-maven-plu
2017-09-07 10:18:09
414
原创 使用SpringEMail API发送Email
这里使用SpringEmail发送Email,这里采用的是Java显示配置Bean,不是采用很多人使用的XML配置Bean,顺带我选择的是smtp协议的qq邮箱,并且qq邮箱要用SSL认证,所以端口不在之前的25,而应该是465首先的是配置文件 mail.properties#-------------------------#-------------------------#---
2017-08-28 14:30:16
790
原创 使用Telnet时不能访问
现在的许多邮件服务器都是使用SSL(安全套接层)进行登入认证,如QQ,cmd下又不支持SSL协议,所以在登录的时候(进行64Base加密吗),当你输入账号密码时,就会求SSL。不仅如此,现在qq邮箱不能用密码登录,而是使用授权码登录这里补充协议Telnet:Telnet协议是TCP/IP协议族中的一员,终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上...
2017-08-27 22:38:04
1100
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人