自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

TheLudlows的博客

会当凌绝顶

  • 博客(93)
  • 收藏
  • 关注

原创 Talent Plan Rust课程总结

首先非常感谢PingCAP能组织一个非常专业的Rust课程,这对于Rust爱好者来说是一次非常好学习的机会,感谢PingCAP为Rust做出的贡献。该课程持续的做了一个月左右,感谢Brian Anderson大神提供优秀的实现供学员参考。课程的目标是用Rust逐步实现一个BitCask数据库,详细请看https://github.com/pingcap/talent-plan/tree/master/courses/rustProject-1通过内存的KVStore学习了如下内容Rust项目工具c

2021-02-25 20:48:20 760 2

原创 第二届华为云数据库挑战赛参赛总结

文章目录1. 赛题分析2. 程序结构及存储结构设计2.1 分区策略2.2 存储结构&索引结构3. 读写实现4. 细节优化5. Java的不足6. 总结继上次参加第五届中间件性能挑战赛之后,又一次参加类似的工程类性能比赛,和上次的TSDB题目类似,本次是实现多版本的KV数据库,由于上次的遗憾出局(复赛第七),这次抱着破釜成舟一定要拿奖的的心态,最终结果也算比较满意(复赛第五,Java语言最高分)。1. 赛题分析本次比赛需实现一个多版本的KV数据库引擎,写入为随机写,查询功能为MinV~NV De

2020-09-22 12:01:03 534 1

翻译 Decoding billions of integers per second through vectorization

在许多重要的应用程序例如搜索引擎和关系数据库系统中,数据以整数数组的形式存储。对这些数组进行编码,最重要的是解码会消耗大量的CPU时间。因此研究人员已经做出了巨大的努力来减少与压缩和减压相关的成本,特别的是已经开发出超标量的现代处理器和单指令多数据(SIMD)指令集。我们引入了一种新的向量化方案SIMD-BP128*,这比以前提出的向量化方法有所改进。它的速度几乎是varint-G8IU和PFOR在台式机处理器上最快的方案的两倍,同时SIMD- BP128*每个整数最多节省2位。为了获得更好的压缩效果,我们

2020-03-12 18:20:45 977

原创 InfluxDB中数据的压缩

Timestamp 压缩在InfluxDB中数据的压缩主要体现在两个方面,分别是时间戳和Field Value,通过TSM文件的存储我们知道相同的Series Key对应的时间戳和Field value是聚集放在一起的,格式如下:CRCFieldValueTypeTimeStamp SizeTimeStampsvalues4 bytes1 bytesN byte...

2020-03-05 20:56:14 3090

原创 InfluxDB的索引存储

TSI默认配置下索引信息存放于内存中,index-version="tsi1"配置作用是将索引信息持久化至硬盘,TSI索引主要包含logFile文件(.tsl结尾)、tsi文件,其实上篇提到的Series 文件也算。tsl、tsi文件位于在每个shard中index目录下。LogFileIndex File当TSL文件大小达到配置的compaction阈值时(由配置文件中的max-inde...

2020-02-22 23:26:48 3025 1

原创 谈谈Roaring Bitmap

BitMap/BitSet被广泛的应用于数据查询中,但其由于数据稀疏造成的内存浪费也不可忽视,因此对压缩BitMap的探索一直在进行,比较知名的有WAH、EWAH、Roaring Bitmap等。其中性能最好并且应用最为广泛的当属Roaring Bitmap,比如Spark、Lucene、Redis、Influxdb等著名项目中都可以看到Roaring Bitmap身影,下面就谈谈Roaring ...

2020-01-19 00:16:39 2077 1

原创 谈谈Bloom Filter

海量数据的过滤及去重,老生常谈的话题了。Bitmap和Bloom Filter是常见的结决办法。Bitmap的思路很单纯,一条数据是否存在只需要一个Bit就可以表示,因此一个Byte可以表示8条数据的布尔值,为每一个可能出现的值分配一个bit,一般Bitmap用来解决某个数字是否存在,这个数字就是Index。在JDK中的实现为BitSet,底层实现为long数组。Bitmap不做过多介绍,原理实...

2020-01-16 16:20:09 249

原创 InfluxDB数据的存储

文章目录LSM TreeInfluxDB 存储架构名词解释文件目录介绍WALSeries FileTSI FileTSM FileInfluxDB存储总结LSM TreeLSM Tree (Log-Structured Merge Tree) 即日志合并树,被用于大量的数据库引擎中,如Hbase、LevelDB等。适用于海量数据的写入,而查询少的情况。主要思想是随机写转化为顺序写。基本流程为,...

2019-12-31 23:37:07 4165

原创 时序数据库之初识InfluxDB

文章目录1. 快速使用2. 基本概念3. InfluxDB操作4. 保留策略(Retention Policies)5. 连续查询(Continuous Query)6. 补充概念7. ShardGroup & Shard & Sharding附1. 函数聚合函数选择函数、变换函数附2. Go Client的使用1. 快速使用docker pull influxdbdocker...

2019-12-18 21:08:03 329

原创 图基础总结

图定义及概念图是由若干给定的顶点及连接两顶点的边所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系。顶点用于代表事物,连接两顶点的边则用于表示两个事物间具有这种关系。图中只包含两种类型的元素:顶点(Vertex)和边(Edge),所以图可以由顶点集合和边集合进行表示,即:G=(V,E)G=(V,E)G=(V,E)。根据边是否具有方向,可以将图分为有向图和无向图两种。可以给边设置...

2019-11-30 12:34:14 338

原创 B-树和B+树总结

B-树与二叉查找树、红黑树等不同,B树适用于读写相对大的数据块的存储系统,B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。这种数据结构常被应用在数据库和文件系统的实作上。在红黑树中提到的2-3树、2-3-4树都属于B-tree,往往实际中使用的是阶数更高的B-tree。 阶 定义为最大数量的子节点树。一个 mmm阶的B树是一个有以下属性的树:每一个节点最多有 m 个子节...

2019-11-27 18:41:44 261

原创 红黑树

之前提到的自平衡二叉查找树,属于一种高度平衡的二叉查找树,对每个结点的平衡因子进行严苛的限制,所以 AVL 树能够提供 (log N) 的结点查询复杂度。也因为对每个结点的平衡因子限制较大,插入和删除结点时,需要进行很频繁的平衡调节操作。接下来谈到了2-3树,2-3树属于自平衡的树,查找复杂度最差(全部是2-结点)是logN,但由于其实现复杂度较高,并且额外对多种结点的维护带来的消耗可能导致这里...

2019-11-05 21:22:03 219

原创 2-3树

2-3树二叉搜索树的高度不确定,可能导致低查询效率,AVL尽管树相对平衡但是插入删除带来的较高的调整复杂度。2-3树尝试通过绝对平衡来寻找突破口,实际上是它具有较高的插入复杂度和实现复杂度,实际应用并不广泛。但2-3树衍生的红黑树在很多底层源码中都有应用。2-3树的定义及概念一颗2-3查找树或一颗空树由以下结点组成:2-结点,包含一个键,以及左右两个链接,分别指向的2-3树的键都小于/...

2019-10-31 22:19:31 373

原创 AVL树

二叉搜索树中查找和插入、删除的操作取决于树的高度,而树的高度又有不确定性,因此需要尽量让树平衡一些,即避免出现线性结构,因此出现了平衡二叉树。定义平衡二叉树也叫自平衡二叉搜索树(Self-Balancing Binary Search Tree)或者AVL树(提出者名字),其本质也是一颗二叉搜索树,不过为了限制左右子树的高度差,避免出现倾斜树等偏向于线性结构演化的情况,所以对二叉搜索树中每个结...

2019-10-31 22:13:14 175

原创 二叉搜索树

当用线性表作为表的组织形式时,可以有三种查找法。其中以二分查找效率最高。但由于二分查找要求表中结点按关键字有序,且不能用链表作存储结构,因此,当表的插入或删除操作频繁时,为维护表的有序性,势必要移动表中很多结点。这种由移动结点引起的额外时间开销,因此需要一种有一种较高的插入和删除效率,并且具备较高的查找效率的数据结构,二叉排序因此产生。定义二叉排序树,也称二叉搜索树(Binary Searc...

2019-10-31 22:07:31 314

原创 谈谈JDK堆外内存的创建和回收

堆外内存的优势在于IO操作,相比堆内存可以减少一次copy和gc的次数。下面通过源码去了解堆外内存的分配和回收。一般分配堆外内存通过ByteBuffer allocateDirect(int capacity)方法,其内部是通过如下构造函数来实现。DirectByteBuffer(int cap) { super(-1, 0, cap, cap);// ma...

2019-09-20 15:14:57 533 1

原创 谈谈Java Reference的原理

ReferenceReference是所有引用类型的父类,它与垃圾回收器合作来来进行GC,Reference类定义了子类的主要逻辑,所以在SoftReference、WeakReference和PhantomReference中几乎完全复用了Reference的逻辑。下面进入Reference类中进行分析它的原理。构造函数和属性其中一个构造函数可以传入一个队列,如果不传入那么使用默认的队...

2019-09-19 21:34:30 421

原创 深入分析CMS垃圾收集器原理

文章目录CMS相关参数触发条件周期性GC主动触发收集过程注意事项前文已经讲过,CMS是老年代垃圾收集器,在收集过程中可以与用户线程并发操作。它可以与Serial收集器和Parallel New收集器搭配使用。CMS牺牲了系统的吞吐量来追求收集速度,适合追求垃圾收集速度的服务器上。CMS相关参数触发条件周期性GC主动触发由后台线程ConcurrentMarkSweepThread循环判断...

2019-06-20 23:47:47 2690 2

原创 Netty解读:高性能无锁队列Jctools源码分析

文章目录JDK BlockingQueue队列概述MpscArrayQueueofferpollMpscCompoundQueueofferpollMpscChunkedArrayQueueofferpoll优化总结lazy set大量的位运算伪共享无锁测试代码地址扩展阅读JDK BlockingQueue队列概述在Java中用的最多的也就是BlockingQueue,所谓的Blocking就...

2019-05-28 20:13:43 4242

原创 分布式一致性:Raft

概述与Paxos不同,Raft相对来说易于理解,在Raft中把复杂的问题分解,分为三个子问题:选举(Leader election)、日志复制(Log replication)、安全性(Safety)。Raft的流程:Raft开始时在集群中选举出Leader负责日志复制的管理,Leader接受来自客户端的事务请求(日志),并将它们复制给集群的其他节点,然后负责通知集群中其他节点提交日志,Lead...

2019-04-16 16:37:37 567

原创 时间轮HashedWheelTimer原理

How to Use?和计划任务线程池ScheduledThreadPoolExecutor的功能类似,HashedWheelTimer也提供了延时执行的功能。前者基于延时队列,而后者基于时间轮实现。先看它的使用方式。HashedWheelTimer hashedWheelTimer = new HashedWheelTimer(100, TimeUnit.MILLISECONDS);has...

2019-04-08 15:53:42 1763

原创 Java并发编程:延时任务队列的实现原理

优先级队列DelayedWorkQueueDelayedWorkQueue用来存放将要执行的任务,其数据结构为有序二叉堆。有序二叉堆的特点:所有根结点必定不大于其两个叶子节点任意结点的子节点的索引位置是其本身索引位置乘2后+1任意结点的父节点的索引位置是该结点的索引位置-1后除2并向下取整当新添加元素时,加入到数组的尾部,后面我们结合代码分析添加过程DelayedWorkQueu...

2019-04-03 09:49:55 1923

原创 流控神器Sentinel指南:熔断降级源码分析

Sentinel 熔断降级(后面简称为降级)会在调用链路中某个资源出现不稳定状态时,例如调用超时或异常比例升高,对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都抛出 DegradeException。Sentinel的降级检测在DegradeSlot中:@Overridepublic void entr...

2019-03-26 14:43:33 1481

原创 Java并发编程系列:深入分析AQS原理

文章目录数据结构定义获取锁# Lock.lock -> Sync.lock# AQS.acquire -> Sync.tryAcquire# addWaiter# acquireQueued释放锁lockInterruptiblyCondition实现原理AQS又称为队列同步器,它是用来构建锁或其他同步组件的基础框架,它是实现ReentrangLock、Semaphore等同步工具的...

2019-03-20 19:06:54 405

原创 Java并发编程系列:Synchronized原理解析

#从对象头的说起https://blog.csdn.net/TheLudlows/article/details/75340361 文章中介绍了对象的内存布局。如上图所示,Mark Word 存储对象自身的运行时数据如哈希值等,例如对象的hashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程的ID、偏向时间戳等。Mark Word一般被设计为非固定的数据结构,以便存储更多的数据...

2019-03-19 00:05:20 397

原创 JMH:Java微基准测试框架

Measure it , Don’t guess!当我们写代码的时候总会遇到一些选择上的困惑,比如数据库连接池Druid和HikariCP到底哪一个效率更高,或者是LinkedList和ArrayList哪个在特定的场景下更快,再比如找到系统性能的瓶颈所在,但是具体是哪个方法哪条语句执行太慢而导致的。不要猜,请测试它。上面提到的场景都可以通过JMH(ava Microbenchmark H...

2019-03-12 16:22:20 984

原创 如何实现性能不错的RPC框架

文章目录1. RPC 结构拆解2. 协议3. 序列化4. Client代理5.通信传输不足1. RPC 结构拆解RPC主要流程如下图:RPC 服务提供者通过 Service Register 发布到注册中心,同时暴露在本地。消费者通过Service Register拉去服务的列表,并且保存至本地缓存。客户方像调用本地方法一样去调用远程接口方法,RPC 框架提供接口的代理实现,实际的调用...

2019-03-11 16:30:06 567

原创 JVM系列:JIT技术概述

1. Java中字节码、机器指令字节码是指平常所了解的 .class 文件,通过 javac 命令编译成字节码。机器指令是指机器可以直接识别运行的代码,字节码是不能直接运行的,JVM 通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译才能运行。很显然逐条的解释其执行速度必然会比可执行的二进制字节码程序慢很多,这是传统的JVM的解释器(Interpreter)的功能。为了提高执行速度...

2019-02-18 00:02:37 1106

原创 Netty对象池技术Recycler解析

文章目录1. Recycler是什么?2. 源码分析2.1 Stack2.2Handle2.3WeakOrderQueue2.4 get获取流程2.5 recycle 回收流程3. 性能测试1. Recycler是什么?Recycler是Netty提供的一款轻量级线程局部对象池工具,在前面的文章中也提到过,比如ChannelOutboundBuffer.Entry 、ByteBuf都是基于Re...

2019-01-23 19:27:54 1242

原创 Netty内存管理深度解析(下)

文章目录概述1. PoolChunk1.1 Buddy算法1.2 PoolChunk初始化1.3 分配2. PoolSubPage3. 分配和释放4. PoolChunkList5. PoolArena概述1. PoolChunk1.1 Buddy算法1.2 PoolChunk初始化1.3 分配2. PoolSubPage3. 分配和释放上面的内容见上文:Netty内存管理深度解析...

2019-01-14 18:23:37 859

原创 Netty内存管理深度解析(上)

文章目录概述1. PoolChunk1.1 Buddy算法1.2 PoolChunk初始化1.3 分配2. PoolSubPage3. 分配小于PageSize3. PoolChunkList4. PoolArena总结概述上篇文章中对Netty的内存分配进行大体的阐述,提到了Netty内存分配通过Arena来进行,并且配合对象池化技术(Recycle)来提高效率。关于池化技术在后面的文章中做...

2019-01-10 23:56:26 1336

原创 Netty内存管理概述

文章目录1. 内存管理概述2. 分配算法概述2.2 SubPage3. ByteBufAllocator3.1 UnPooledByteBufAllocator3.2 PooledByteBufAllocator1. 内存管理概述内存管理的主要目的合理分配内存,减少内存碎片,及时回收资源,提高内存的使用效率。从操作系统层面来说,各个软件在运行时向操作系统请求对计算机内存资源进行快速的分配,...

2019-01-09 12:53:37 1441

原创 Netty进阶:自顶向下解析FastThreadLocal

引子 1FastThreadLocalThread我们知道EventLoopGroup相当于线程池,而EventLoop是其中的线程,用来执行IO任务和一些handler中的业务逻辑。在Netty进阶:Netty核心NioEventLoop原理解析文章中详解的介绍了EventLoopGroup和EventLoop的构造过程,以及他们如何去执行IO任务等。但是关于NioEventLoop中持有的...

2018-12-26 19:44:04 2042 2

原创 零拷贝的前世今生

文章目录1. 操作系統中的零拷贝1.1 操作系统零拷贝的分类1.2 避免内核空间和用户空间拷贝的实现2. Java NIO中零拷贝2.1 map2.2 transferTo2.3 DirectByteBuffer3. Netty中零拷贝3.1 CompositeByteBuf3.2 wrap3.3 slice1. 操作系統中的零拷贝摘自WikiZero-copy" describes co...

2018-12-21 18:32:41 752

原创 流控神器Sentinel指南:深入分析流控原理(下)

文章目录1. 指标数据的统计入口2. 滑动窗口3. 三种流控方式3.1 Default3.2 Warm Up3.3 匀速器4. 退出的流程上篇文章中从规则的定义开始说起,再到调用树,Context、slotChain等,详细的介绍了访问资源,到FlowSlot的entry方法为止。本文将继续上篇文章的主线,阐述流量控制的实现原理。在介绍之前我们需要对滑动窗口实时指标统计进行分析。1. 指标数...

2018-12-17 19:54:16 3322

原创 流控神器Sentinel指南:深入分析流控原理(上)

1. 加载规则上一篇文章中,我们队Sentinel的抽象概念进行粗略的描述,这篇文章在此基础上对Sentinel的原理进行更深一步的认识。在Sentinel中要对资源进行保护需要先配置规则,规则包括流量控制规则、熔断降级规则、系统保护规则 以及授权规则。每一种规则都有对应的xxxRuleManager工具类来加载生效。以FlowRule为例,一般设置规则的代码如下:private stat...

2018-12-14 18:29:48 1863

原创 Netty相关文章目录汇总

半年前开始写Netty的文章,对自己来说是一个温故的过程,也是学习的过程。好了!Netty目录如下:基础篇,API的了解和基本的使用:1. Netty基础:概念介绍2. Netty基础:第一个Netty程序3. Netty基础:Netty的关键组件4. Netty基础:Netty中的传输5. Netty基础:ByteBuf详解6. Netty基础:细说ChannelHandler和...

2018-12-13 18:29:23 3461 3

原创 流控神器Sentinel指南:浅析Sentinel中的抽象概念

文章目录1. Sentinel中的抽象概念2 Resource3. Entry4. Context5. Node6. Slot7. Metric8. rule上篇文章中介绍了Sentinel的一些使用方式,从这篇文章开始叙述Sentinel的一些高级用法和底层的实现原理。1. Sentinel中的抽象概念解读源码之前我们需要认识Sentinel中的抽象概念。比较重要的概念为:Resource...

2018-12-13 18:07:08 1472

原创 浅析Java8 Stream原理

文章目录操作符的分类流水线的结构AbstractPipelineStream的生成源码分析添加中间操作万事俱备,只欠东风上一篇文章中大体的介绍了Stream的概念和基本API的使用,Stream用起来的确非常的爽。这一片文章将会讲述Stream的底层实现原理。操作符的分类,Stream中的操作可以分为两大类:中间操作与结束操作,中间操作只是对操作进行了记录,只有结束操作才会触发实际的计算(即...

2018-12-03 20:27:57 4336

原创 异步编程 CompletableFuture详解

文章目录1. CompletableFuture概述2. How to use2.1 创建CompletableFuture2.2 获取结果2.3 转换操作2.4 组合操作2.5 完成时处理2.6 异常处理1. CompletableFuture概述在异步编程中,Future/Promise模式是一种广泛使用的异步开发模式,其中 Future 对象代表一个尚未完成异步操作的结果。从JDK 1....

2018-11-29 18:57:01 1333

空空如也

空空如也

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

TA关注的人

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