自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

你学废了吗?

持续改进,坦诚合作!我是徐同学,愿与你共同进步!

  • 博客(119)
  • 资源 (4)
  • 收藏
  • 关注

原创 ZooKeeper客户端源码(零)——客户端API使用

ZooKeeper客户端所有对节点的请求API都有同步阻塞和异步回调两种方式,异步回调就是传入一个回调函数,响应处理时进行回调通知。

2022-03-16 09:00:00 1014 4

原创 ZooKeeper源码阅读心得分享+源码基本结构+源码环境搭建

ZooKeeper源码的脉络就像一个迷宫,要想玩这个迷宫游戏,必须找到迷宫的入口。最近把ZooKeeper源码看了个大概,有一些心得想和大家分享和探讨。

2022-03-07 11:05:44 3812 9

原创 Zookeeper会话管理源码深入探讨

深入探讨会话创建、分桶管理、清理和激活原理。

2022-03-03 14:26:10 2625 9

原创 ZooKeeper运维——集群动态迁移与扩缩容(不停机+不丢失)

zk集群的动态迁移与扩缩容需要做到两个不:不停机!不丢失!

2021-09-27 08:30:00 6104 28

原创 ZooKeeper集群Leader选举理论解读(初次选举和故障恢复)

ZooKeeper 参考 Paxos算法,专门设计了一种支持崩溃恢复的原子广播协议 Zab(Zookeeper Atomic Broadcast),Leader选举是其核心思想,也是保证ZooKeeper数据一致性的关键所在。

2021-09-25 16:12:26 1068 3

原创 ZooKeeper运维——数据备份与恢复(事务日志+快照日志,万字总结,你想要的都有)

事务日志是增量数据,快照日志是某个时刻全量数据,合二为一可以最大限度恢复数据。通过日志文件恢复数据,取最新的快照日志文件反序列化生成一个 DataTree,然后用事务日志对这棵 DataTree做数据修正。

2021-09-23 09:49:42 3900 31

原创 分布式系统的基石之ZooKeeper——基本原理+场景应用+集群搭建(最强万字入门指南)

ZooKeeper是一个可靠的、强一致性的、没有单点故障的分布式数据存储系统。因为其出色的设计(ZAB一致性算法,Watch机制等)和协调能力,使得它成为很多分布式系统的基石,就像其名称动物园管理员一样,做着比较基层的管理协调工作,比如配置管理,命名服务,服务注册发现等。

2021-09-12 23:56:52 2598 30

原创 ZooKeeper监控数据采集方案——Telegraf Plugin

zookeeper监控数据的收集不外乎是对四字命令运用,Telegraf 是现成的高性能收集脚本,与influxdb搭配最佳。

2021-09-09 22:10:43 2041 25

原创 WebSocket通信原理和在Tomcat中实现源码详解(万字爆肝)

WebSocket的出现不是空穴来风,起初在HTTP/1.1基础上通过轮询和长连接达到信息实时同步的功能,但是这并没有跳出HTTP/1.1自身的缺陷。HTTP/1.1明显的两个缺陷:消息头冗长且为文本传输,请求响应模式。为此,WebSocket诞生了,跳出HTTP/1.1,建立一个新的真正全双工通信协议。

2021-08-31 20:29:07 7728 57

原创 Tomcat连接器Connector源码解读(一)架构概览,如何设计?为什么这样设计?

Connector作为独立模块,封装底层网络通信,使Servlet容器和具体的协议及I/O方式解耦,易扩展、高性能。这也使得架构变得抽象复杂,Connector需要应对多种协议和I/O方式的组合,高度的抽象和封装。Connector只负责接收和解析请求,具体的业务处理还需要交给容器,所以需要一个适配器作为Connector和Container连接的桥梁。

2021-08-10 00:04:26 1243 30

原创 模板方法模式:剖析模板方法在JDK、Tomcat、Mybatis等开源框架中的应用

学习设计模式最好的方式就是,看看开源的源码框架中是怎么用的。模板方法模式,非常之简单,记住两点:代码复用和功能扩展。

2021-07-18 23:39:35 811 32

原创 Builder构建者模式,将复杂对象的创建过程与其表示分离,活学活用才是王道

构建者模式,将复杂对象的创建过程与其表示分离,通过设置不同的可选参数,“定制化”创建不同的对象表示。

2021-07-14 19:42:32 1570 38

原创 硬核解读工厂模式,结合实际源码架构把工厂模式玩出花儿来!

工厂模式,一般分为简单工厂、工厂方法、抽象工厂,三种工厂是一个由简到繁的递进过程,越来越抽象,越来越复杂,找准其适用场景,才能化繁为简。

2021-07-11 20:59:03 758 32

原创 Tomcat主线程监听SHUTDOWN,如何远程关闭Tomcat?守护线程守护了谁?

守护线程里创建线程的线程默认也是守护线程。当所有的非守护线程退出后,守护线程因为没有了守护对象也就跟着结束了。(周末水文)

2021-07-03 18:31:31 1435 24

原创 窥探Tomcat整体架构,server.xml常用配置解析

如果能对 Tomcat 有一个高屋建瓴的把握,然后再庖丁解牛,一步步深入源码中分析每一个核心功能的实现细节,才能达到事半功倍的功效。

2021-06-27 22:46:33 1362 32

原创 【开源周荐】分布式配置管理神器Qihoo360/QConf入门指北(部署、配置、使用、架构原理)

QConf使用zk服务器存储所有的配置信息,配置名为zk的节点名,配置项的值为zk的节点值。利用zk的监听回调机制,注册感兴趣的事件监听,实现配置及时更新和同步。无锁化读写,共享缓存,消息队列、多语言SDK,神呀!

2021-06-25 00:15:36 1060 20

原创 雪花算法snowflake分布式id生成原理详解,以及对解决时钟回拨问题几种方案讨论

雪花算法的原理很简单,主要由时间戳+机器id+序列号生成64bit的ID,整体趋势递增,且全局唯一,性能也不错。每种组成标识的bit都可以自定义,灵活性很高。因为雪花算法强依赖机器时钟,就难以避免时钟回拨问题,解决的方式很多,无非从避免和缓解两个角度出发。

2021-06-18 10:42:09 5339 13

原创 Tomcat的启动与关闭:详解启动类Bootstrap和Catalina,彻底搞懂catalina.home和catalina.base的区别和作用范围

Bootstrap作为一个启动引导类,通过加装org.apache.catalina.startup.Catalina,对Catalina发号施令,其目的是保证了Catalina和Bootstrap的隔离和实现细节不可见,其次二者可以单独打包,像组件一样进行组装和拆除。

2021-06-13 08:12:15 3350 10

原创 搭建Tomcat源码阅读环境,无bug运行调试。答应我,和我一起学习Tomcat,不要放弃!

全网最好,没有之一,无bug运行Tomcat源码。经验分享,学习总结。

2021-06-06 11:17:24 3682 51

原创 Java双亲委派模型:为什么要双亲委派?如何打破它?破在哪里?

1. 双亲委派就是类加载器之间的层级关系,加载类的过程是一个递归调用的过程,首先一层一层向上委托父类加载器加载,直到到达最顶层启动类加载器,启动类加载器无法加载时,再一层一层向下委托给子类加载器加载。2. 双亲委派的目的主要是为了保证`java`官方的类库`\lib`和扩展类库`\lib\ext`的加载安全性,不会被开发者覆盖。...

2021-06-01 23:11:31 14633 29

原创 Tomcat如何快速响应静态资源(DefaultServlet+浏览器缓存)

Tomcat利用浏览器缓存,在第一次请求时,进行io操作读取文件内容返回给浏览器;第二次请求,如果文件没有修改过,则返回304状态码告知浏览器文件没有修改,可以直接从浏览器缓存中读取。第三次请求,此时文件修改了,则io读取文件内容返回给浏览器。

2021-05-21 16:26:40 1639 2

原创 关于ReentrantReadWriteLock,首个获取读锁的线程单独记录问题讨论(该如何更好的阅读源码)

`firstReader`表示第一个获取读锁的线程,若当前线程等于`firstReader`,读锁重入时`firstReaderHoldCount+1`,而非首个获取读锁的线程则用一个继承了`ThreadLocal`的内部类`ThreadLocalHoldCounter`给每个线程计数。为什么第一个线程不用`ThreadLocalHoldCounter`计数呢?单独拎出来的意义何在?

2021-04-16 00:19:00 606 2

原创 InheritableThreadLocal源码解析,子线程如何获取父线程的本地变量?

日常工作中,经常使用`ThreadLocal`来避免线程并发问题,每个线程访问自己本地的变量,没有竞争,没有锁,非常高效。现在有一个业务场景,需要创建一些子线程来执行任务,主线程中设置了`ThreadLocal`的值,想在子线程中获取,能获取到吗?答案是:不能。

2021-04-13 00:41:35 674

原创 ThreadLocal源码深度解读,为什么要注意内存泄漏?

使用完ThreadLocal一定要调用remove,不然会内存泄漏,你知道这其中的原委吗。

2021-04-11 17:32:37 556 1

原创 ConcurrentHashMap源码深度解析(二)(java8)——直呼Doug Lea是真的细(带你参透扩容机制)

扩容是重头戏,看过的人都说难。确实,和java7版本比起来,难度真不是一个量级的。有些细节看着莫名其妙,一想就是好几天,看似想明白也只能算是猜想合理,直呼Doug Lea的心思是真的细啊!深究细节是费时且痛苦的,欣喜的是,怎么也想不明白的逻辑,发现这次是源码错了!官方JDK!现在市面上普遍都在用java8,怎么可能存在bug呢?

2021-03-21 14:44:48 2437 19

原创 ConcurrentHashMap源码深度解析(一)(java8)——不可不知的基本概念(助你拿下源码事半功倍)

ConcurrentHashMap java1.8数据结构采用数组+链表+红黑树,废弃分段锁`Segement`,进一步降低锁的粒度,可将锁直接加在数组占位节点上。同时发生哈希冲突的节点依然采用链表法,但是加了红黑树进行检索优化,即链表与红黑树互相转化,即使到了极端情况,检索的时间复杂度为O(lgn),相对于O(n)性能提升不少。

2021-03-14 23:06:41 737 3

原创 ConcurrentHashMap 源码深度解析(java7)——原来如此简单

ConcurrentHashMap在java7中的实现有很多值得学习借鉴的地方,比如基本的数据结构数组链表的应用,并发开发,哈希算法等都可以学以致用。而且了解了java7的实现细节,才能更好的明白java8中为什么要做的各种优化?1. ConcurrentHashMap的数据结构是怎样的?2. ConcurrentHashMap的容量为什么是2的整数次方?3. 如何实现的并发安全?是读写分离吗?get需要加锁吗?4. 哈希冲突体现在哪里,如何解决?5. 扩容思想是什么,怎么扩容?

2021-03-07 10:36:05 628 2

原创 如何实现一个高效的关键词过滤功能?——DFA算法

DFA即Deterministic Finite Automaton,翻译过来就是确定性有限自动机。简单原理就是:在一个有限的集合,其中的元素都有两种状态,结束和继续(可以用0代表继续,1代表结束),可以从一个元素检索到下一个元素,直到元素的状态为结束为止。1. DFA实现的关键词过滤,性能不再受限于关键词的数量,只与被检索的文本长度有关。时间复杂度为小于等于O(n),n是被检索文本的长度。2. DFA关键词过滤,是精准过滤,无法实现模糊过滤,如我是*人,*匹配单个字符,%匹配多个字符。

2021-01-31 18:34:29 2615

原创 CopyOnWriteArrayList源码解读——CopyOnWrite思想的利与弊

`CopyOnWriteArrayList`利用`CopyOnWrite`思想,即在写时复制一份副本进行修改,修改完成后,再将新值赋值给旧值,为保证线程安全,需要在所有的写操作加悲观锁或者乐观锁,而读操作不必加锁,这就使得读写分离,读读不互斥,读写不互斥,空间换时间,性能大大提升。

2020-12-24 00:07:17 818

原创 Runtime.getRuntime().exec踩坑总结(/bin/sh -c、异常流重定向)

1、exec(java.lang.String)`并不是想当然的是一个由命令+参数拼接的字符串。2、exec(java.lang.String[])`数组第一个元素是命令,从第二个元素起都是第一个元素命令的参数。3、可通过`/bin/sh -c`将一个多操作命令合并成一个完整命令执行,避免创建可执行脚本文件。4、用于控制进程的类`Process`,有三种I/O流管道,互相独立,管道空时不可读,满时不可写,遇到三个流管道中至少一个处于不可读写状态时,命令进程会阻塞等待。

2020-12-20 18:24:59 9966 1

原创 FutureTask源码解读——阻塞获取异步计算结果(阻塞、取消、装饰器、适配器、Callable)

FutureTask作为Runnable的子类,它就像是一个装饰器在Runnable异步执行的功能上,又增加了可以获取异步执行状态以及结果的功能:其内部维护了一个`Callable`类型的成员变量,任务代码会包装成callable,FutureTask直接调用Callable.call()执行任务代码并返回结果。还维护了一个链表实现的栈,外部获取结果的线程在任务没有执行完前都会被压入栈并阻塞(awaitDone),任务完成唤醒所有阻塞线程(finishCompletion)。

2020-11-15 21:29:04 743

原创 ScheduledThreadPoolExecutor源码解读(一)——DelayedWorkQueue高度定制延迟阻塞优先工作队列

工作队列是高度定制化的延迟阻塞队列DelayedWorkQueue,其实现原理和DelayQueue基本一样,核心数据结构是二叉最小堆的优先队列,队列满时会自动扩容,所以offer操作永远不会阻塞,maximumPoolSize也就用不上了,所以线程池中永远会保持至多有corePoolSize个工作线程正在运行。

2020-11-08 13:25:15 794

原创 ScheduledThreadPoolExecutor源码解读(二)——ScheduledFutureTask时间调度执行任务(延迟执行、周期性执行)

延迟阻塞队列`DelayedWorkQueue`中放的元素是`ScheduledFutureTask`,提交的任务被包装成`ScheduledFutureTask`放进工作队列,`Woker`工作线程消费工作队列中的任务,即调用`ScheduledFutureTask.run()`,`ScheduledFutureTask`又调用任务的`run()`,这点和`ThreadPoolExecutor`差不多,而`ScheduledThreadPoolExecutor`是如何实现按时间调度的呢?

2020-11-08 09:24:49 914 2

原创 influxdb基础(七)——select查询基础语法(类sql,细节与踩坑总结)

篇幅这么长,直接看总结就完事了!influxdb的查询语法在语句基本组成上和mysql非常相似,都有基本的`select … from …`、`group by `、`order by`、`limit`、聚合函数等,在一定程度上降低了`influxdb`的学习门槛。但是也有很多细节需要注意,比如:1. `group by`后面只能对`tags`和`time`分组。2. `order by` 只能对`time`进行排序。3. 聚合函数只能作用于`fields`。4. `limit`语法也不太一样。

2020-11-07 20:22:18 10240

原创 influxdb基础(六)——influxdb.conf配置详解(官方文档翻译)

influxdb默认配置路径为`/etc/influxdb/influxdb.conf `。其内包含了数据文件存储路径、大小、缓存刷入`TSM`文件阈值、压缩shard阈值、是否打印log、并发数、端口等各种配置。非常有必要了解其有哪些配置和策略,对理解`influxdb`的运作原理上有一定帮助。配置虽多只需要知道其中一些主要的,大部分都可以保持默认配置,等真的需要时再深入研究其配置。

2020-11-05 23:01:13 2448

原创 influxdb基础(五)——数据的备份与恢复(influxd backup/influxd restore)

influxdb中有两种数据可以备份,一种是元数据meta,一种是db数据。meta元数据的备份是整个备份,不能拆分,而db数据的备份,可完整备份,也可为某个数据库或某个数据库的保留策略甚至为某个shard的数据备份,也可增量备份即备份一段时间范围内的数据。

2020-11-03 22:58:18 4859

原创 influxdb基础(四)——influxdb保留策略(retention policy)自动清理过期数据

因为存储的数据都是跟时间有关的测量数值,多用于图表展示,不太需要人为的去删除,而有时统计的数据是秒级,甚至毫秒级、纳秒级的,势必造成数据量巨大。如果一直长久存储会占用机器大量资源,而且有些数据越旧越失去它的时效性,越没有参考价值,所以保留策略`retention policy`就是可以让数据存储一段时间后自动清除。

2020-11-01 22:38:29 8052 3

原创 influxdb基础(三)——influxdb按时间分片存储数据(shard和shard group)

influxdb的存储结构是怎样的?数据持有化在哪里,以什么形式存在?`shard`是`influxdb`存储引擎`TSM`的具体实现。`TSM TREE`是专门为`influxdb`构建的数据存储格式。与现有的`B+ tree`或`LSM tree`实现相比,`TSM tree`具有更好的压缩和更高的读写吞吐量。`shard group`是存储`shard`的逻辑容器,每一个`shard group`都有一个不重叠的时间跨度,其是根据保留策略`retention policy`的`duration

2020-11-01 18:31:54 6703 1

原创 influxdb基础(二)——influxdb基本概念 (database、measurement、fields、tags) + 简单实操 (简单insert、select)

1. `influxdb`作为时序库,与时间有很大的关系,`measurement`相当于一个时间轴,`point`就是时间轴上的一个点,类比mysql就是表中的一条记录。2. 经常作为查询条件的可设置为`tags`索引,数据类型只能是`string`。3. 普通数值,不用来作为查询条件或者很少用于查询条件设置为`fields`,数据类型支持`float`、`integer`、`string`、`boolean`。4. `measurement`中time时间戳是UTC时间,与东八区少8小时,可在s

2020-10-29 00:50:27 6192 3

原创 influxdb基础(一)——influxdb安装与基本配置(centos)

influxdb是一个以时间为序列的高性能查询和存储的数据库,广泛用于监控数据实时统计等场景。#下载wget https://dl.influxdata.com/influxdb/releases/influxdb-1.8.0.x86_64.rpm#安装sudo yum localinstall influxdb-1.8.0.x86_64.rpm

2020-10-26 23:15:37 3393 1

2021尚硅谷技术之Zookeeper笔记

尚硅谷2021 zookeeper 笔记

2021-09-17

Tomcat源码阅读环境.rar

包括Tomcat安装包和源码包以及github源码,再加一篇本人写的搭建教程https://stefan.blog.csdn.net/article/details/117620726

2021-06-06

influxdb配置官方文档翻译/etc/influxdb/influxdb.conf

配置内容大多根据英文翻译再加上自己的理解而得。阅读配置了解并应证了很多`inflxudb`的运行策略,如: - data的配置,TSM文件存放位置、wal文件存放位置都可以自行修改。 - shard大小可配,默认1g,达到最大值,拒绝写入,shard空闲4个小时后将被压缩。 - cache大小可配,默认25m,到达这个阈值将创建快照输入tsm文件。空闲的cache没有达到25m,也会在10分钟后创建快照刷入tsm文件。 - 数据库最大的series数,默认100万。 - 写超时、最大并发数、查询 超时、慢日志、一次查询的最大point数等。 - 保留策略检查数据过期的时间间隔,默认半小时。

2020-11-05

node-v12.19.0-x64.msi(免费下载)

启动hexo时 node v14版本过高会报错,node-v12.19.0-x64.msi官方的可能下载慢,现在提供免费版

2020-10-17

空空如也

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

TA关注的人

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