自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 h2database源码解析-如何更新一条行记录

这里的更新包括两种操作:删、改。更新操作涉及的内容在其他文章里面已经做过介绍了,本文主要是介绍更新的代码流程,以了解更新操作都做了哪些事情。如果有未介绍过的知识点会详细介绍。

2023-02-12 12:00:00 703

原创 h2database源码解析-表和索引

如果表的主键索引有多个字段或者不是数字类型的,那么尽管定义了主键索引,h2也是把它当做二级索引使用,因此也是创建一个MVSecondaryIndex对象,只不过这种MVSecondaryIndex对象的名字叫做“PRIMARY_KEY_X”(最后的X表示序号),表示这是某个表的主键索引。它的使用场景比较简单,如果表定义了主键索引,索引中字段只有一个,并且是数字类型的,那么h2会再创建一个MVDelegateIndex对象,该对象有一个属性mainIndex指向了MVPrimaryIndex对象。

2023-02-11 13:38:31 1457 1

原创 h2database源码解析-查询优化器原理

order by子句里面可以指定字段的排序规则,是ASC还是DESC,对于可以为NULL的字段,还有两种排序规则,分别是无论升序还是降序NULL值始终在最前以及无论升序还是降序NULL值始终在最后的排序规则,在h2中使用常量ASCENDING(0)、DESCENDING(1)、NULLS_FIRST(2)、NULLS_LAST(4)表示上述四种排序规则,不过后面两种不能在SQL语句中指定,h2会基于系统默认值设定,默认情况下,升序是NULL值始终在前,降序是NULL值始终在最后。

2023-02-11 10:33:26 936

原创 h2database源码解析-将B+树刷新到磁盘

h2的表、索引、undo log都是使用B+树存储的,这些数据存储到B+树上之后,需要将树从内存再刷新到磁盘上。因为树刷新到磁盘,涉及到磁盘的随机访问,所以一般的数据库实现上,都是有一个后台线程以一定的频率将脏页面刷新到磁盘上。h2也是这么实现的,它是借助于BackgroundWriterThread后台线程完成脏页面的刷新。

2023-02-05 15:25:53 688

原创 h2database源码解析-如何将undo log插入到B树

在文章《》中介绍了一条数据如何插入到B树,里面对undo log的构建进行了介绍,本文将介绍undo log构建好之后如何插入到B+树。

2023-02-04 22:16:50 695

原创 h2database源码解析-如何插入一条行记录

在h2中,多个不同时运行的事务的undo log可能会存储在同一个B树上,比如,在时刻M,同时运行了三个事务T1,T2,T3,那么T1,T2,T3的undo log分别存储在不同的undo log树上,而且它们的undo logId都是从0开始的 ,时刻M+1上述三个事务都执行完成,在时刻M+2运行了事务T4,那么事务T4的undo log和事务T1的undo log可能会存储在同一个B树上。上面的内容是将行记录插入到表里面的操作,接下来介绍事务提交的时候,h2都做了哪些动作。

2023-02-03 23:06:24 783

原创 skywalking解析-如何在idea中调试skywalking agent

当我从github上下载下来skywalking agent的代码后,面临的第一个问题就是如何调试。因为skywalking agent的运行模式与普通程序运行方式不一样,它是通过java agent方式运行的。本文接下来介绍如何在本地调试skywalking agent源码。

2023-01-08 12:40:06 2333 1

原创 skywalking解析-入门

skywalking是一个分布式追踪系统 , 它可以帮助我们看到一个请求经过的所有调用链路,比如中间调用了多少个微服务,访问了多少次数据库,redis,mq 等中间件。以前,系统间调用没有那么复杂,系统间调用也比较简单,当微服务开始盛行的时候,系统间的调用关系就变得非常复杂了,很少有人能够说得清各个系统间的调用关系,那么分布式追踪系统便应运而生。分布式追踪系统不仅可以展示出调用链路,还可以提供服务监控,比如可以监控哪些服务调用失败了,服务被访问了多少次。

2023-01-02 23:08:49 1124

原创 druid解析-过滤器详解

我们也可以自定义过滤器。一般过滤器都是继承自FilterAdapter,之后改写其中的部分方法,然后将过滤器名与类名配置到类路径下文件META-INF/druid-filter.properties中,之后在参数“druid.filters”上增加我们自定义的过滤器名就可以了。

2023-01-01 17:26:31 4190

原创 druid解析-数据源关闭源码解析

当我们的应用停止的时候,必须调用DruidDataSource.close()方法将数据源关闭。下面我们就来详细看看close()方法。

2023-01-01 01:16:38 1491

原创 druid解析-连接销毁线程解析

在druid初始化的过程中,会创建一个线程销毁任务DestroyTask,该任务将会以一定的频率执行,默认是1s执行一次,也可以通过timeBetweenEvictionRunsMillis设置多长时间执行一次。shrink()方法代码比较多,而且也是非常重要的方法,下面我们再梳理一下该方法。

2023-01-01 00:54:42 1544

原创 druid解析-如何回收连接

连接使用完,要调用连接对象的close()方法将连接关闭。

2022-12-31 23:01:44 1259

原创 druid解析-应用线程获取连接

pollLast(nanos)和takeLast()两个方法的区别在于,pollLast()会不断的尝试获取连接,当获取连接的等待时间超过了入参nanos,该方法直接返回null,而takeLast()会一直尝试获取连接,直到获取到连接为止。方法getConnectionInternal()通过pollLast(nanos)或者takeLast()从连接池里面拿连接,而且都是从连接池的最后获取,这就意味着越频繁使用的连接越会在下次使用。

2022-12-31 22:21:02 1340

原创 druid解析-连接池初始化

本文主要介绍连接池初始化的过程。

2022-12-31 20:55:22 1751 1

原创 druid解析-DruidDataSource初始化

druid是一个数据库连接池,它持有一系列的数据库连接,当应用程序需要数据库连接时,通过druid的数据源可以直接获取连接。同时它也有很多附加功能,比如监控等。在应用程序中,我们一般都是直接创建DruidDataSource对象,然后通过它的getConnection()方法获取数据库连接。可以看到init()方法主要是做参数的初始化,然后就创建连接对象,执行完init()方法后,如果设置了过滤器,则先执行过滤器,否则调用getConnectionDirect()方法,该方法用于返回连接对象。

2022-12-31 16:46:16 1783

原创 美团技术团队-日志导致线程Block的这些坑,你不得不防

文章。该文章非常好,以前以为日志打印不会出现问题,细读大作,才知道以前忽略了很多东西。标题:日志导致线程Block的这些坑,你不得不防。

2022-11-27 19:28:06 175

原创 shardingJDBC-归并引擎源码解析

使用sharding时,有些语句可能被分发到多个数据库节点执行,之后将这些结果汇总加工返回到客户端。归并引擎的作用便是完成对结果的汇总加工,也叫作结果归并。sharding结果归并从功能上分为遍历、排序、分组、分页和聚合5种类型,从结构划分可分为流式归并、内存归并和装饰者归并,流式归并和内存归并是互斥的,装饰者归并可以在流式归并和内存归并之上做进一步的处理。流式归并是指每一次从结果集中获取到的数据,都能够通过逐条获取的方式返回正确的单条数据,它与数据库原生的返回结果集的方式最为契合。遍历、排序以及流式

2022-02-05 20:46:19 1623 3

原创 解决ChromeDriver被知乎反爬的问题

今天心血来潮,想着爬取一下知乎网站,但是在使用ChromeDriver登录的时候就遇到了问题:上网查了一下,是因为知乎对ChromeDriver有反爬策略。网上大部分提供的是python程序或者使用的chrome版本较低,我使用的是...

2021-12-12 11:01:06 2284 1

翻译 LMAX Disruptor User Guide

本文翻译自https://lmax-exchange.github.io/disruptor/user-guide/index.html#_using_the_disruptor文章目录简介核心概念Multicast Events(多播事件)消费者依赖图空间预分配无锁Getting Started基本应用发布事件使用原始方式发布消息基础配置单生产者和多生产者等待策略从ring buffer中清除对象高级应用处理大批量数据LMAX Disruptor是一个高性能的线程间消息传递工具库。它源于LMAX对.

2021-11-21 16:17:46 364

原创 前后端分离架构

本想自己写一篇关于前后端分离的文章,无奈写来写去都没人家写的好,只能贴出链接了。【前后端分离架构概述】:这篇文章介绍了前后端分离的三个阶段:未分离->半分离->分离,总结的很全面,推荐。文章里面涉及到一个概念:SPA单页应用。单页应用说白了就是只有一个网页的应用,SPA是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用程序。浏览器一开始会加载必需的HTML、CSS和JavaScript,所有的操作都在这张页面上完成,都由JavaScript来控制。【轻松理解前后端分

2021-11-06 23:17:20 548

原创 spring cloud gateway核心概念之断言和过滤器

- 路由(Route):**路由是网关的基本构件**。它由ID、目标URI、一组断言和一组过滤器组成。如果断言为真,则匹配该路由。gateway使用类RouteDefinition表示路由定义。 - 断言(Predicate):**参照Java8的新特性Predicate**。Predicate接受一个输入参数,返回一个布尔值结果,输入参数可以是HTTP请求的任何部分,比如报文头、参数、报文体,而且还可以将多个断言组合在一起。 - 过滤器(Filter):可以在发送到目标URI之前或之后修改请求和响应

2021-09-14 22:37:38 2228

原创 spring cloud gateway 初探

spring cloud gateway是spring全家桶里面的网关组件,再介绍gateway之前,先说一下网关的作用。文章目录1、何为网关2、网关作用1、何为网关网关本来是网络中的概念,可以简单的理解为是进入一个网络的入口。在微服务中,网关的作用也与此类似。众所周知,单体应用拆成多个微服务后,每个微服务都有自己独立的地址,如果微服务很多,面对众多地址,调用方无法分辨,会给调用方带来使用上的困扰。此时,我们可以在微服务前面加上网关,所有对微服务的调用都通过网关转发,服务调用方始终只能看到一个地址,

2021-09-11 00:22:59 218

原创 shardingJDBC教程-读写分离

本文将springboot与shardingJDBC结合起来,搭建一个读写分离应用。本文目录1、编写pom文件2、数据库准备3、编写实体类和mapper文件4、springboot配置文件5、编写测试类6、运行结果参考文章1、编写pom文件下面是pom文件依赖的部分内容:<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter

2021-09-04 02:16:04 248

原创 shardingJDBC教程-分库分表

shardingJDBC的介绍直接引用官网描述:定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。

2021-09-04 00:22:45 985 3

原创 nacos解析-详解服务端保存服务数据以及健康检查原理

本文基于nacos-2.0.3版本注册服务时,nacos服务端调用InstanceController.register()方法完成注册。InstanceController.register()再调用InstanceOperatorClientImpl.registerInstance()注册服务,下面是registerInstance()方法代码: public void registerInstance(String namespaceId, String serviceName, I.

2021-08-29 22:32:38 1171

原创 nacos解析-基于spring cloud的服务注册原理

前面文章介绍了nacos的配置管理,从本文开始介绍nacos的服务注册与发现。通过上面网页的介绍,可以知道,nacos的服务注册最关键的是注解@EnableDiscoveryClient,本文接下来以该注解为起点,介绍服务注册原理。

2021-08-29 16:08:40 548

原创 nacos解析-使用Open API管理配置

nacos提供了功能丰富的Open API,使得我们可以使用http协议访问服务端,并管理服务端的配置数据。具体的功能可以参考下面网页:> https://nacos.io/zh-cn/docs/open-api.html下面代码借助nacos的工具类,使用Open API提供了配置的增删改查功能。

2021-08-25 23:00:53 2995

原创 nacos解析-是否可以配置多个@NacosPropertySource

本文基于nacos-2.0.3版本nacos中,每一个@NacosPropertySource都被解析为一个PropertySource对象,并且将该对象添加到Environment的propertySources集合中,这个集合是List对象,默认每新增一个PropertySource对象,都会将其添加到集合的末尾,我们可以通过NacosPropertySource中的first、before等属性设置它们的顺序。所有的@NacosPropertySource解析完毕后,下面开始解析@NacosV.

2021-08-20 22:23:16 5350

原创 nacos解析-详解配置自动刷新原理

本文基于nacos-2.0.3版本当客户端设置autoRefreshed = true时,比如:@NacosValue(value = "${XXX:XX}", autoRefreshed = true)或者@NacosPropertySource(dataId = "XXX", autoRefreshed = true)服务端配置值发生变化,客户端的属性值也会跟着发生变化。这是如何做到的?本文将介绍其背后的原理。在自动刷新中,ClientWorker类起着非常关键的作用,其作用如下:.

2021-08-18 22:31:21 9205

原创 nacos解析-raft算法日志复制原理

本文基于nacos-2.0.3版本nacos在集群模式下,使用内置数据库时,当发布新的配置或者更新配置时,nacos使用raft算法将配置分发给集群中的其他机器。本文将详细分析分发原理。首先说明如何使nacos在集群模式使用内置数据库:虚拟机启动参数配置为:-Dnacos.standalone=false-DembeddedStorage=true...

2021-08-16 21:39:47 1376

原创 nacos解析-解密服务端保存配置数据原理

本文基于nacos-2.0.3版本本文分析nacos服务端保存配置数据的原理。通过上一篇文章《nacos解析-客户端是如何拉取配置信息的》我们知道了客户端通过http协议将请求发送到服务端,链接的URL为:http://127.0.0.1:8848/nacos/v1/cs/configs通过URL的path我们很容易在服务端找到处理该请求的类:ConfigController。该类位于config模块下,通过名字就可以知道该模块用于配置管理。ConfigController提供了对配置的增.

2021-08-12 10:06:50 845

原创 nacos解析-客户端是如何拉取配置信息的

nacos服务端源码是使用spring boot编写的,初看源码,完全找不到头绪,不知道从哪看起。于是我改变了思路,从客户端开始看,然后从客户端调用的服务逐步深入到服务端。那么本文就来介绍一下客户端是如何从服务端拉取配置。文章目录一、注解@EnableNacosConfig1、找到服务器地址信息2、创建ConfigService对象3、创建与服务器的连接一、注解@EnableNacosConfig要想使用nacos,客户端必须配置注解@EnableNacosConfig。一般的使用EnableNac

2021-08-07 18:05:57 2574

原创 Nacos解析-本地运行源码

本文是解析nacos的第一篇文章,使用的是nacos-2.0.3版本。github地址:https://github.com/alibaba/nacos.git。要分析源码,首先需要在本地运行源码。下载完成后,nacos是无法直接运行的,需要对源码做一些改动。下面介绍我对nacos所做的改动。文章目录一、解决编译报错1、下载protoc2、生成缺失代码二、设置启动参数三、启动一、解决编译报错代码下载后,idea会报错,提示缺少com.alibaba.nacos.consistency.entity包

2021-08-07 12:11:02 1243

原创 【小技巧】修复chrome被2345劫持

按照了2345 好压之后,点击chrome发现每次都会自动打开2345的主页。特别讨厌这种违背自己意愿的强盗行径。从网上查找大部分都是修改exe的名字,重新创建快捷方式(作为一个有洁癖的人,不能容忍这种方式)。每次打开chrome都会自动打开2345主页,说明要么2345修改了程序启动脚本,要么是有后台程序在实时监测。看了chrome的快捷方式和exe程序都没有发现什么问题,于是打开任务管理器,通过仔细检查还真发现了后台程序:...

2021-07-20 22:08:19 6351 3

原创 leetcode通过题目汇总

本文爬取leetcode网页,然后通过程序自动生成(git地址以后完善)。

2021-07-04 22:09:21 183

转载 消息队列中推和拉模式区别

kafka使用拉模式;rocketmq支持拉模式和推模式。介绍推模式和拉模式的区别

2021-06-05 21:16:27 1114 1

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

本文主要介绍一下缓存雪崩、缓存穿透、缓存击穿三者的区别,以及如何避免。缓存雪崩缓存承担了大量的查询请求,有力的保护了数据库,但是某一时刻,缓存的数据全部失效,或者缓存宕机,导致所有的查询都落入到了数据库上,数据库突然收到暴增的流量,严重会导致数据库宕机。解决方案:设置缓存失效时间时,加入随机值,避免大量缓存同时失效。使用redis集群。对后端资源的访问,比如数据库,使用限流工具。缓存穿透缓存穿透是查询一个不存在的数据,在缓存上没有命中,程序接着访问数据库,数据库也没有命中,同时查询完数据

2021-04-24 16:24:56 151 5

原创 论Redis 7种加锁方式的优缺点

本文参考文章《论Redis分布式锁的正确使用姿势》总结一下文中提到的7种加锁方式的优缺点。方案一:SETNX + EXPIRE优点:实现简单,通过修改过期时间可以支持锁重入,锁超时自动释放;缺点:因为上述命令是分两步执行,如果第二步执行失败,将造成无法解锁。方案二:SETNX + value值是(系统时间+过期时间)优点:加锁是原子操作,解决了方案一的缺点。缺点:实现复杂,每个机器的时间必须保持同步,其他加锁线程会修改过期时间,锁有可能被其他线程错误释放。方案三:使用Lua脚本(包含SETNX

2021-04-24 13:56:56 2919 3

原创 设计模式-简单工厂、工厂方法、抽象工厂

简单工厂、工厂方法、抽象工厂三个设计模式都带有工厂二字,它们的作用类似,都是用于生产产品对象。本文将介绍它们之间区别。文章目录1、简单工厂模式2、工厂方法模式3、抽象工厂模式1、简单工厂模式该模式下有一个工厂类,工厂类提供静态方法,静态方法根据入参的不同创建不同类的对象。这些对象都一个共同的基类,因此还需要有一个抽象产品类和一系列具体产品类。该模式简单易实现,将创建与使用分开,实现了解耦,但是当添加新产品时就需要修改工厂类的逻辑,违背开放 - 关闭原则,而且产品过多时,也会造成该类复杂,另静态方法不

2021-04-18 11:04:54 237 2

原创 设计模式-单例模式

单例模式表示当前实例只有一个,且由它自己负责创建对象。本文主要介绍单例的几种写法。这里写目录标题1、饿汉式2、懒汉式3、双检锁4、静态内部类1、饿汉式饿汉式不管会不会使用到,都首先创建好对象。好处是不存在线程安全问题,缺点是可能造成资源浪费。public class Singleton { private static Singleton INSTANCE=new Singleton(); private Singleton(){}//注意构造方法私有 public sta

2021-04-18 01:17:22 130 3

空空如也

空空如也

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

TA关注的人

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