自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 资源 (1)
  • 收藏
  • 关注

原创 Clickhouse --- Distributed引擎

Distributed 原理解析Distributed表引擎是分布式表的代名词,不存储任何数据,只是作为代理,能够自动路由到集群中的各个节点,所以其需要和其他的表引擎一起工作。一张分片表由两部分组成:本地表:通常用_local结尾,主要承载数据。分布式表:通常用_all结尾,其与本地表形成一对多的映射关系,通过分布式表可以操作多张本地表。1 定义形式一张Distributed表引擎的定义形式如下:ENGINE = Distributed(cluster, database, table,

2021-07-17 10:50:32 2487 2

原创 Clickhouse --- 副本与分片

Clickhouse — 副本与分片(1)文章目录Clickhouse --- 副本与分片(1)1. 概述2. 数据副本2.1 特点2.2 定义形式3. RelicatedMergeTree原理解析3.1 Zookeeper内部结构3.2 副本协同的核心流程3.2.1 INSERT3.2.2 MERGE3.2.3 MUTATION3.2.4 ALTER4. 数据分片4.1 自定义分片与副本1. 概述集群作为副本与分片的基础将Clickhouse的服务从单个节点扩展到多个节点。Clickhouse的配

2021-07-09 21:23:58 653 3

原创 The Law of Demeter

The Law of Demeter文章目录The Law of Demeter简介定义1. Chain Calls2. The Law and the Builder Pattern3. 例外总结简介最近在提交代码质量检测的时候,总是因为这个major错误搞的痛不欲生,头发狂掉。弄懂了以后特地记录一下,省的忘记。在使用面向对象的语言进行编程的时候,我们为了使得coding代码更加具有概括性、可重用、高鲁棒、低耦,系统更加稳定可维护。从而定制了这一套规则。下面我们看一下怎么定义这个规则的。定义

2021-07-04 16:40:25 211

原创 java多线程---Batch多线程统计问题

java多线程—统计汇总的问题文章目录java多线程---统计汇总的问题1. 问题描述2. 问题解决方式2.0 瑕疵方法2.1 使用synchronized修饰count2.2 ReentrantLock版本2.3 加上CountDownLatch2.4 Future方法3. 总结1. 问题描述在现实开发中,为了考虑性能问题,我们可以把大量的数据拆分成不同的Batch进行批处理,这边使用到了ExecutorService.submit()的线程池处理方法。那么问题也来了,到底怎么对数据进行汇总可以满

2021-07-03 12:29:37 787 1

原创 MergeTree 原理

MergeTree 原理文章目录MergeTree 原理1. MergeTree的创建方式与存储方式1.1 创建方式1.2 存储结构2. 数据分区2.1 数据分区规则2.2 分区命名规则2.3 一级索引(常驻内存)2.3.1 索引粒度2.3.2 生成规则以及查询过程3. 数据存储(.bin)4.数据标记5.总结Clickhouse最大的特点之一是拥有比较多的表引擎。所有表引擎中最强大的引擎是合并树结构(*MergeTree)。1. MergeTree的创建方式与存储方式如果你现在就有一张clickh

2021-06-27 22:25:08 1815 2

原创 clickhouse---数据定义

Clickhouse — 数据定义文章目录Clickhouse --- 数据定义1. 简介2. 数据定义2.1 基础类型2.2 复合类型2.3 特殊类型1. 简介Clickhouse 是一款服务于Yandex.Metrica的产品。Metrica 是一款用于web流量分析工具,对采集的数据进行数据分析(OLAP的分析)。因此,ClickHouse是一款OLAP数据库。这里主要介绍其数据定义的几种方式。2. 数据定义作为一款完整的数据库管理系统(DBMS),Clickhouse拥有完整的DDL与D

2021-06-20 16:15:45 202

原创 数据库----三范式

本文从函数依赖-》数据异常-》一张表的分割,来介绍关系型数据库三范式。

2020-08-24 21:03:00 307

原创 装饰者模式 ---设计模式

为了说明这个模式,这里使用咖啡销售为例。首先看一下如下的关系图:由上图可以看出:对于每种咖啡的加料,我们都继承自CondimentDecorator这个抽象类,而这个抽象类又继承了Baverage这个抽象类。在配料类中,我们可以看到有个beverage的引用!这个引用的作用:不断new配料时,将之前的配方传入作为类变量的引用。这样我们在计算cost()时就可以通过多态来求得成品咖啡的价格!下面看一下Espresso的代码public class Espresso extends Bever

2020-08-07 11:07:52 129

原创 单例模式(Singleton Pattern)

文章目录1. 什么是单例模式?2. 单例模式的实现方法(分为线程安全和线程不安全)1. 什么是单例模式?对于一些对象,我们只需要其一个实例对象,比如说:线程池、缓存、注册表、日志对象等。如果这些对象创建了多个实例,会导致不必要的资源占用。这个模式确保一个类只有一个实例,并提供一个全局访问点2. 单例模式的实现方法(分为线程安全和线程不安全)首先,我们先看一下如下的代码:public class Singleton { private static Singleton singleton

2020-08-03 20:14:15 83

原创 leetcode1014 --- 反思

最佳观光组合题目描述给定正整数数组 A,A[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的距离为 j - i。一对景点(i < j)组成的观光组合的得分为(A[i] + A[j] + i - j):景点的评分之和减去它们两者之间的距离。返回一对观光景点能取得的最高分。示例:输入:[8,1,5,2,6]输出:11解释:i = 0, j = 2, A[i] + A[j] + i - j = 8 + 5 + 0 - 2 = 11提示:2 <= A.leng

2020-06-17 09:35:58 91

原创 Morris 前序遍历

文章目录1. 前期准备2. 题目描述3. 解析4. 代码1. 前期准备题目morris遍历介绍2. 题目描述二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。示例 1:输入: [1,3,null,null,2] 1 / 3 \ 2输出: [3,1,null,null,2] 3 / 1 \ 2示例 2:输入: [3,1,4,null,null,2] 3 / \1 4 / 2输出: [2

2020-06-03 10:22:22 381

原创 Java并发笔记 (16)------ Executor

文章目录Executor 框架介绍1. 两级调度模型2. Executor框架3. Executor成员1. FixedThreadPool在这里插入图片描述2.SingleThreadExecutor3. CachedThreadPool4. ScheduledThreadPoolExecutorExecutor 框架介绍1. 两级调度模型由上面这张图片可以看出:上层:Java多线程程序通常把应用分解为若干个任务,Executor框架)将这些任务映射为固定数量的线程底层:操作系统内核将这些线

2020-05-28 17:46:34 192

原创 LRU详解+实现

文章目录LRU缓存1.简述LRU2. 实现LRU3. 实现代码LRU缓存自测链接1.简述LRU这里使用一张图进行描述示例使用的 capicity 为 3,进入顺序为 7 0 1 2 0 3 0 42. 实现LRU设计需求:获取数据 get(key) : 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。写入数据 put(key, value): 如果密钥已经存在,则变更其数据值;如果密钥不存在,则插入该组「密钥/数据值」。当缓存容量达到上限时,它应该

2020-05-25 10:34:00 2534

原创 Java并发笔记 (15)------ Java 线程池

文章目录Java 线程池1. 实现原理2. 线程池使用3. 向线程池提交任务4. 关闭线程池Java 线程池使用线程池的好处:降低资源消耗:重复利用已创建的线程提高响应速度:不需要线程创建的时间提高线程的管理性:通过线程池,可以对线程进行同意分配调度1. 实现原理线程池处理流程如下图所示:过程描述:线程池判断核心线程池里的线程是否都在执行任务 过程 1如果不是,则创建一个新的工作线程来执行任务。如果不是,则进入下个流程。线程池判断工作队列是否已经满。过程 2如果阻

2020-05-24 21:27:47 141

原创 Java并发笔记 (15)------ 并发工具类

文章目录1. CountDownLatch2. 同步屏障 CyclicBarrier1.简介2. 应用场景3. Semaphore1. CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。可以等价于下面的代码:public class joinCountDown { public static void main(String[] args) throws InterruptedException { Thread parser1

2020-05-23 14:11:11 159

原创 Java并发笔记 (14)------ 阻塞队列

文章目录阻塞队列1.简述2. Java的阻塞队列2.1 ArrayBlockingQueue(FIFO,有界)2.2 LinkedBlockingQueue(FIFO,有界)2.3 PriorityBlockingQueue(优先队列)2.4 DelayQueue(无界)2.5 SynchronousQueue(FIFO)2.6 LinkedBlockingDeque3. 实现原理阻塞队列1.简述阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方

2020-05-22 22:16:12 158

原创 Java并发笔记 (13)------ java 高并发容器

文章目录Java并发容器一、ConcurrentHashMap为什么要用ConcurrentHashMap?1. HashMap的线程不安全2. HashTable 效率低下源码分析1.我们先看一下`jdk1.6`结构图及分析:2. jdk 1.8二、 ConcurrentLinkedQueue结构分析源码分析Java并发容器吐槽一下:面试前真要准备好源代码分析,看源码真的是一种享受!一、ConcurrentHashMap为什么要用ConcurrentHashMap?1. HashMap的线程不安

2020-05-18 22:25:46 156

原创 python---正则表达式

文章目录正则表达式1.模块内容2.正则表达式对象3.示例正则表达式最近学到了python的正则表达式,通过规则和例子来描述这个玩意首先介绍一下规则,如下表所示:模式描述^匹配字符串的开头$匹配字符串的末尾。.匹配任意字符,除了换行符。[…]用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’[^…]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。*匹配0个或多个的表达式。+匹配1个或多个的表达式。

2020-05-18 13:03:35 71

原创 递归翻转数组

K 个一组翻转链表给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。示例:给你这个链表:1->2->3->4->5当 k = 2 时,应当返回: 2->1->4->3->5当 k = 3 时,应当返回: 3->2->1->4->5说明:你的算法只能使用常数的额外空间。你不能只是单纯的改变节

2020-05-16 14:55:50 629

原创 Java并发笔记 (12)--- Condition与LockSupport 剖析

文章目录Condition1. Condition接口与示例2. Condition的实现方式1. 等待队列2. 等待3. 通知补充:LockSupportCondition任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、wait(long timeout)、notify()以及notifyAll()方法,这些方法与synchronized同步关键字配合,以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与L

2020-05-15 13:04:12 248

原创 Java并发笔记 (11)--- 读写锁

文章目录1. 接口2. 源码层次分析读写锁1. 读写状态的设计2. 写锁的获取与释放3. 读锁的获取与释放4. 锁降级1. 接口ReadWriteLock 定义了读锁与写锁的两个方法,readLock()和writeLock()方法,其实现为ReentrantReadWriteLockpublic class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializable我们看一下ReadWriteLock

2020-05-14 17:44:01 273 1

原创 动态规划 --- 购买股票的最佳时机

文章目录[leetcode123]购买股票的最佳时机[leetcode123]购买股票的最佳时机题目链接:[leetcode123]题目描述:给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [3,3,5,0,0,3,1,4]输出: 6解释: 在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 =

2020-05-12 09:29:15 221

原创 Java并发笔记 (10)---- ReentrantLock

文章目录重入锁(ReentrantLock)1. 实现重新进入2. 公平与非公平获取锁的区别重入锁(ReentrantLock)就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。除此之外,该锁的还支持获取锁时的公平和非公平性选择。ReentrantLock虽然没能像synchronized关键字一样支持隐式的重进入,但是在调用lock()方法时,已经获取到锁的线程,能够再次调用 lock() 方法获取锁而不被阻塞。下面将着重分析ReentrantLock是如何实现重进入和公平性获取锁

2020-05-11 22:25:15 115

原创 AQS源码分析 ---- 2

文章目录3)共享式同步状态获取与释放4) 独占式超时获取同步状态3)共享式同步状态获取与释放与独占式获取最主要的区别:能否有多个线程同时获取到同步状态上图,左半边表示共享式访问数据,后边为独占式访问数据。通过调用同步器的acquireShared(int arg)方法可以共享式地获取同步状态public final void acquireShared(int arg) { if (tryAcquireShared(arg) < 0) doAcquireShared

2020-05-09 22:38:59 133

原创 AQS源码分析 ---- 1

1) 同步队列同步器依赖内部的同步队列(一个FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成为一个节点(Node)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。下面直接呈上源代码!!!字多看的头疼同步队列中的节点(Node):static final class No...

2020-05-03 22:35:32 148

原创 Java并发笔记 (9)---- AQS示例

文章目录队列同步器的接口与示例队列同步器 AbstractQueuedSynchronizer(以下简称A.Q.S),是用来构建锁或者其他同步组件的基础框架。同步器是实现锁(也可以是任意同步组件)的关键锁是面向使用者的,它定义了使用者与锁交互的接口同步器面向的是锁的实现者,它简化了锁的实现方式队列同步器的接口与示例同步器的设计是基于模板方法模式的重写同步器指定的方法时,需要使用...

2020-05-03 22:30:55 391

原创 Java并发笔记 (8)---- Lock

锁锁是用来控制多个线程访问共享资源的方式。在Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能。区别:缺少了(synchronized)隐式获取释放锁的便捷性。拥有了锁获取与释放的可操作性、可中断的获取锁以及超时...

2020-05-03 21:05:41 118

原创 前缀树解析

前缀树1. 介绍首先用一张图来描述一下:以 包含‘A-Z’ 的前缀树为例从图中可以看出,前缀树是个树状结构,从root结点出发,如果遇到一个字符X,则下移到该字符对应的子节点中。说到这里有点疑惑,数据结构到底是什么样子的?class Trie{ boolean isEnd; // 如果 isEnd 说明从根节点到此节点之间的路径,为一个预先插入的单词 // 当然这...

2020-05-02 12:29:47 239

原创 Java并发笔记 (7)---volatile/sychronized

1. volatile和synchronized关键字volatile 可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量访问的可见性。synchronized可以修饰方法或者以同步块的形式来进行使用,它保证了线程对变量访问的可见性和排他性。我们对如下代码进行反编译public class S...

2020-05-01 20:28:39 142

原创 Java并发笔记 (6)---- 线程基础

文章目录1. 构造线程2.启动线程3.中断4.安全地终止线程1. 构造线程这里先放上Thread.java 中 init()的源代码private void init(ThreadGroup g, Runnable target, String name, long stackSize, AccessControlContext acc, ...

2020-04-30 22:29:36 87

原创 Java并发笔记 (5)

此处介绍的是线程的基础,下一个将介绍线程的终止与启动

2020-04-30 13:05:51 88

原创 “山脉数组”

山脉数组中查找目标值给你一个 山脉数组 mountainArr,请你返回能够使得 mountainArr.get(index) 等于 target 最小 的下标 index 值。如果不存在这样的下标 index,就请返回 -1。何为山脉数组?如果数组 A 是一个山脉数组的话,那它满足如下条件:首先,A.length >= 3其次,在 0 < i < A.length -...

2020-04-29 12:25:35 472

原创 旋转数组处理方法归纳

1. 旋转数组的定义这里参考 leetcode 189这题可以有多种方式进行求解这里给出原地旋转的方法,见下图:代码:public void rotate(int[] nums, int k) { if (nums == null || nums.length <= 1){ return ; } int len = nums.length;...

2020-04-28 12:30:29 165

原创 背包问题 ---- 多重背包

1.多重背包介绍有N种物品和一个容量为T的背包,第i种物品最多有itemC[i]件可用,价值为value[i],体积为weight[i],求解:选哪些物品放入背包,可以使得这些物品的价值最大,并且体积总和不超过背包容量。与完全背包的区别 :完全背包:自助餐【不了解的可以先看一下这篇!多重背包:限量供应2. 代码多重背包加个条件就是完全背包测试用例:private static in...

2020-04-27 11:49:14 228

原创 Morris 遍历

Morris遍历的规则​ 假设来到当前节点 cur != null如果 cur 无左孩子,cur = cur.right如果 cur 有左孩子,找到左子树的最右节点,记为 cur1如果 cur1.right == null,让其指针指向 cur,(cur = cur.left)如果 cur1.right == cur,让其指向空,cur = cur.right代码:pub...

2020-04-26 12:26:38 211

原创 volatile 内存语义

volatile 内存语义1. volatile 的特性volatile变量的单个读/写,可以看成是使用同一个锁对这些单个读/写操作做了同步volatile long val = 0L; // 使用volatile声明64位的long型变量public void set(long l) { val = l; // 单个volatile变量的写}public void getAn...

2020-04-25 23:33:40 113

原创 背包问题 ---- 完全背包

照常先来问题描述1.完全背包介绍有N种物品和一个容量为T的背包,每种物品都就可以选择任意多个,第i种物品的价值为P[i],体积为V[i],求解:选哪些物品放入背包,可卡因使得这些物品的价值最大,并且体积总和不超过背包容量。之前讲过 0/1 背包问题。完全背包的区别在于:可以有无限量的 汉堡 物品 !2.递归首先最容易想到的为递归,递归可以把所有的可能都遍历到。由于其很高的 时间复杂度 以...

2020-04-25 12:32:53 229

原创 happens-before 解析

happens-before这里直接从讲述 happens-before 的定义及规则1.定义A happens-before B,A 的执行结果将对 B 操作可见,而且 A 的执行顺序排在 B 之前。A, B 存在happens-before关系,并不意味着Java平台的具体实现必须要按照happens-before关系指定的顺序来执行。(如果重排序之后的执行结果,与按happens-...

2020-04-24 22:29:11 137

原创 Java并发笔记 (4)---- 重排序

重排序重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。1 数据依赖分为三种类型名称代码示例写后读a = 1;b = a;写后写a = 1;a = 2;读后写a = b;b = 1重排序上面两个操作的执行顺序,程序的执行结果就会被改变。**注意:**不同处理器之间和不同线程之间的数据依赖性不被编译器和处理器考虑!!...

2020-04-24 21:51:14 107

原创 二叉树的遍历与重建

重建二叉树这里介绍一下用先序-中序,后序-中序遍历结果来构建二叉树的过程。什么是先序,后序,中序遍历?首先看一下如下的二叉树结构。各种遍历的规则:前序遍历(根左右): 对访问到的每个结点,先访问根结点,然后是左结点,然后是右结点中序遍历(左根右): 对访问到的每个结点,先访问左结点,然后是根结点,然后是右结点后序遍历(左右根): 对访问到的每个结点,先访问左结点,然后是右结点,然...

2020-04-24 13:00:06 284

special.zip

情人节 自制旋转魔方相册 点击魔方即可进行魔方展开。在微信开发平台实现,具体详见代码!里面的图片目录需要按照自己的目录进行替换操作,直接使用会产生无法访问资源的问题。

2020-05-12

空空如也

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

TA关注的人

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