自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 小记一次海量数据实时查询域名库设计(下)

二. WHOIS库设计根据WHOIS数据查询业务场景、响应性能等需求,该库采用Hbase + ES 技术组合设计,其中HBASE存储全量WHOIS数据,ES库作为查询索引库,只存储查询WHOIS数据时的索引项数据。当提交一条查询请求时,首先从ES库中利用索引检索出记录的唯一键【_id】,再使用该唯一键从Hbase中查询出全量数据。HBASE库配置:同PDNS库设计中HBASE配置。ES库配置:7服务器集群【与HBASE共用硬件服务器】,JDK版本1.8,单节点JVM堆内存固定为12G。2.1 WHO

2020-09-01 11:49:26 642

原创 小记一次海量数据实时查询域名库设计(上)

一.PDNS库设计根据前期调研及技术选型,基于第三方外部PDNS数据,开发导入程序,完成构建基于Hadoop HBASE的PDNS实时数据查询系统,系统平台采用8台4U服务器组成Hadoop集群。服务器配置为:Xeon Silver 4110 @2.1Ghz,128G内存,24*2T硬盘。HDFS块大小:256MBHbase Region大小:10GB其他为默认配置。库设计主要考虑点说明:高并发。无高并发需求,不存在该场景,HBASE的RowKey设计时不需要考虑Key值散列程度。实

2020-09-01 11:39:15 584

原创 JAVA - EnumMap与EnumSet简单总结

EnumMap实现Map接口,基于数组实现,用于存储key为枚举类型的键值对集合类。其中K,V 使用双数组实现。Key为枚举类型。在枚举中,每个枚举对象对应一个ordinal唯一值,因此在寻址时候,可使用ordinal作为数组下标进行寻址,速度很快。效率比HashMap要高,且大多数基本操作是常数级。多线程不安全,可使用synchronizedMap包装器 支持多线程安全。集合内部的key按自然序排列,Key不能插入空。使用集合视图的迭代器迭代元素时,如果Map被其他线程修改了。不会抛出Co

2020-08-31 09:25:42 366

原创 JAVA - TreeMap与TreeSet

TreeMap线程不安全,基于红黑树实现的有序集合。集合顺序默认为自然排序,也可以自定义比较器实现排序规则。实现NavigableMap接口,实现一些了系列导航定位方法。集合操作开销在 O(LogN)【containkey\get\put\remove】。Get方法过程使用key在红黑树中进行遍历查找,如果Key小于树节点中的key值,则进入左子树继续查找。Key大于树节点中的key值则进入右子树查找,直到找到为止。Put方法过程如果Root节点为空,则插入的kv对,保存在Roo

2020-08-31 09:21:09 180

原创 JAVA - LinkedHashMap特点及小结

LinkedHashMap继承自HashMap的,多线程不安全的、用于存储K、V键值对的,有序集合类。在HashMap基础上,对存储的元素节点添加了前后指针、额外维护了一个双向链表维持顺序。由于增加了前后指针,当进行Put、Get、Replace等操作时,会有维护双向链表的额外开销。使用迭代器遍历时比HM要快。使用场景是:当设定为按访问顺序存储时,适合做LRU缓存。特点LinkedHM的存储单元类型使用Entry类作为存储类,继承自HashMap的Node类.Entry类添加了before

2020-08-31 09:15:57 949

原创 JAVA - HashTable特点及小结

HashTableJDK1.0引入,实现Map接口,用于存储K,V键值对的集合类。主要特点:Key不可为空、多线程安全、无序。底层采用数组 + 链表 的结构。特点在源码基础上,查阅并结合其他文章资料,以介绍+提问的形式,列出HashTable以下常见特点若干项。HashTable的存储单元类型使用Entry类型的对象来保存内容。Entry类型中包括hash、key、value、next四部分。HashTable的存储结构存储结构中使用了数组、单链表,其中单链表是用来处理哈希冲突时用的

2020-08-24 09:59:22 924 1

原创 JAVA - HashMap特点及小结

HashMapHashMap实现了Map接口,用于存储K,V键值对的集合类。主要特征包括:Key可存NULL、无序、线程不安全、 底层使用了数组+链表+红黑树的结构。特点在阅读源码基础上,查阅并结合其他文章资料,以介绍+提问的形式,列出HashMap以下常见特点若干项。HashMap存储单元类型。hashMap内部使用Node类型对象来保存内容。Node类型中包括hash、key、value、next四部分。HashMap的存储结构。HashMap的存储结构中使用了Node类型的数

2020-08-24 09:39:39 1286

原创 JAVA - LIST接口类简单小结

LIST接口类JAVA中LIST接口类主要包括Vector、ArrayList、Stack、LinkedList、CopyOnWriteArrayList类。底层可用数据或链表【实现算法基础结构】实现。相关接口有RandomAccess、Cloneable、Serializable、Deque。List接口特点实现List接口,通过迭代器可双向顺序遍历数据。【每个线程可以获取自己的迭代器对象,多个线程间的迭代器彼此间不干扰!】迭代器不支持并发修改,使用fail-fast策略快速失败。【一旦修

2020-08-17 10:45:36 103

原创 JAVA - MCS、CLH、自旋锁小结及简单性能对比

CLH队列锁CLH队列锁是一种高性能、公平的自旋锁。 当多线程竞争一把锁时,获取不到锁的线程,会排队进入CLH队列的队尾,然后自旋等待,直到其前驱线程释放锁。特点:没有惊群效应。假设有1000个线程等待获取锁,锁释放后,只会通知队列中的第一个线程去竞争锁,避免了同时唤醒大量线程 在瞬间争抢CPU资源,避免了惊群效应。CLH队列锁的长处是空间复杂度低(假设有n个线程。L个锁,每一个线程每次仅仅获取一个锁,那么须要的存储空间是O(L+n),n个线程有n个myNode。L个锁有L个tail)。

2020-08-10 10:11:25 558

原创 JAVA - 四种引用

前言Java中的具有代表性的四种引用有强引用、软引用、弱引用、虚引用。其中软引用、弱引用、虚引用继承自抽象类Reference。对于上面四种引用,只要引用置为空,遭遇GC必回收【废话】。GC时,如果你的类实例中重写了Finalize函数,则会触发该函数,当然一般情况下是不推荐重写该函数的。强引用JAVA中引用类型默认使用的就是强引用。只要强引用指向的不是NULL,GC通过跟可达算法判断该引用指向的对象还在使用中,对象就不会被回收。当对象不再使用时,可将强引用置为空,帮助GC回收。【一般情

2020-08-01 14:49:20 221

原创 JAVA - ThreadLocal 相关小结

ThreadLocalThreadLocal称为线程局部变量。每个线程独有的一块ThreadLocalMap空间,用来存储数据,不同线程间的ThreadLocalMap中数据是隔离的。ThreadLocalMap是个数组结构,由若干个Entry元素组成,初始大小为16。一个Entry中 包括key 和value两部分。Key为弱引用类型,存储ThreadLocal的hashcode为键;value可存储任意对象。线程中多个ThreadLocal 代表了多个key,在ThreadLocalMap中对

2020-08-01 13:22:22 120

原创 JAVA Proxy代理模式

代理模式给目标对象提供一个代理对象,通过代理访问目标对象,以控制访问者对目标对象的访问。好处是将访问者和目标类隔离,保护了目标类对象、扩展了目标类的功能。分类静态代理:在程序运行前,class文件就已经被创建了,代理类和目标类的关系在运行前就确定了。动态代理:在程序运行时,使用JVM反射等机制动态生成的代理类,代理类和目标类的关系在运行时确定。动态代理实现方案:JDK动态代理、ASM代理【Spring AOP代理】、CGlib代理。使用场景Spring AOP。【Bean工厂+灵活装配+

2020-07-30 13:44:54 147

原创 JAVA Observer观察者模式

观察者模式一种消息通知的模式,采用一对多的依赖关系,让一个消息源被多个观察者同时监听。当消息源发出消息时,会通知所有观察者,使他们能够执行各自的处理方法。主要解决一个对象状态改变时 给其他对象通知的问题,且要考虑到易用和低耦合。构建过程消息源(Subject)聚合持有:观察者对象的集合。实现:观察者的注册方法(加入列表);实现:通知观察者的方法;观察者抽象类(Observer)聚合持有:消息源对象(Subject);实现:观察者处理方法。具体观察者(ConcreteObser

2020-07-27 10:28:45 93

原创 JAVA Bridge桥接模式

桥接模式一个复杂类中可能包括了多个维度的属性行为,桥接模式在逻辑上可以将这些维度进行分离,分离为抽象部分(接口)和实现(抽象类)部分。1.通过分离抽象部分和实现部分可使原本复杂的类各部分间解耦合,且更符合“单一职责原则”。2.抽象部分和实现部分这两个部分,可以独立地变化、独立扩展,通过自由组合产生新的类。这种通过(聚合和关联关系)产生类的方式较传统通过继承产生新类的方式,扩展性更好,减少了系统中类,防止类爆炸问题。构建过程确定要设计的复杂类的维度。由抽象部分(Interface)和实现部分(Abst

2020-07-21 16:05:15 122

原创 JAVA Adaptor适配器模式

适配器模式适配器又叫包装器,把一个类的接口通过适配器转换成所期望的另外一种接口,使原本接口不同而无法一起工作的两个类能够一起工作。特点适配器模式可分为类适配器和对象适配器。类适配器:通过继承创建的适配器。对象适配器:通过组合创建的适配器。类适配器由于采用继承,因此 耦合度要高 与对象适配器。构建过程明确被适配的Adaptee类、适配的目标类接口Target(注意是目标类的接口!不是目标类!)定义适配器接口Adapter类。Adapter类通过组合或继承方式实现适配Adaptee的逻

2020-07-20 11:37:00 251

原创 设计模式原则

指导思想1. 可维护性(Maintainability)修改功能时,改动的地方越少,改动越简单(越不伤筋动骨),可维护性越好。2. 可复用性(Resuability)代码可以被重复使用;实现通用的类库。3. 可扩展性(Extensibility/Scalability)添加功能无需修改原来代码(使用多态、基于抽象类和接口编程)。4. 灵活性(Flexibility/Mobility/Adaptability)代码接口可以灵活调用。设计原则1. 单一职责原则(Single Responsi

2020-07-20 00:39:40 91

原创 JAVA Decorator装饰器模式

装饰器模式装饰器模式可动态的将新的责任功能附加到原来类的对象上,其扩展性比继承更具有弹性。在某些场景下,父类可能会派生出数量众多的子类,为防止“类爆炸”。可采用装饰器模式。特点装饰类采用抽象类,使其可后续派生出多种具体装饰类。通过聚合,持有被装饰类的对象,即包装了被装饰类的对象。装饰类通过继承被包装类的基类(或实现其接口),保证了其 行为方法与被包装类一致。构建过程从包装类ConcreteConponent中抽象出共同基类(抽象类Component)。装饰器Decorator,继承抽

2020-07-14 11:50:41 182

原创 JAVA Builder建造者模式

建造者模式建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,用于解决”复杂对象的创建”工作。使用多个简单的方法一步步构建出复杂的对象,提供了一种创建复杂对象的最佳方式,一般可采用链式编程实现建造者模式。构建过程从被创建类中抽象出AbstractBuilder基类(抽象类或接口)。创建建造类ConcreteBuilder实现AbstractBuilder基类的抽象方法。使用建造类ConcreteBuilder建造复杂对象,建造过程中尽量采用链式编程。使用

2020-07-13 17:16:00 124

原创 JAVA Composite组合模式

组合模式在设计中,如果一个类在逻辑上可由其他几个类组成,那么可使用组合模式描述这些类整体与部分的关系。组合类 主要通过聚合 其组成部分类 的接口,实现灵活组合。应用的场景包括,文件系统树结构,其构成逻辑是一个由文件和文件夹组成,文件夹由可以由文件和文件夹组合而成。构建过程从多个原子类X,Y,Z中抽象出共同类(父类或接口类)。定义聚合物类Composite,Composite聚合了X、Y、Z原子类的接口。聚合物类Composite,通过Add和Delete方法,向类中的<接口类型>列表

2020-07-13 01:48:37 433

原创 JAVA Chain of Responsibility责任链模式

责任链模式责任链,将功能的实现抽象成一条流水线(执行链),流水线上有多个节点,每个节点都有特定的职责,按特定的工序执行处理。如果某个节点处理完了就可以根据实际业务需求传递给下一个节点继续处理或者返回处理完毕。构建过程将责任进行分类,抽象出责任接口。根据责任接口实现多个责任类。每个责任类可通过Set方法更新处理过的对象。责任类可定义enable变量,实现责任是否启用。定义责任链类。责任链实现add方法将单个责任添加到链中(可通过链表)。add方法可使用Builder模式,这样实现链式添加

2020-07-08 16:46:34 138

原创 JAVA Strategy策略模式

策略模式当使一项功能要使用多种算法(可抽象成同类的算法)进行计算时,可利用多态,通过共同的接口动态地选择不同策略算法。可以避免业务中使用不同策略算法时,写成多个If…else…。适合结合责任链模式使用。构建过程抽象接口。将不同的处理策略算法,抽象出共性(输入、输出等),定义到相同的接口方法中。实现多种策略类。基于共同的接口,根据需求定义并实现多种策略类。使用策略。当要使用某策略时(例如策略X),定义接口引用,指向策略X类实例化对象。进行计算的业务方法中只需通过接口传递对应的策略X

2020-07-08 10:47:26 149

原创 Java - CountDownLatch和CyclicBarrier小结

背景这两JUC类适合放一起比较,随便写写,简单小结。CountDownLatch要点:底层采用AQS队列,源码很简单300行。使用:初始化对象并填入(计数器)值,例如:new CountDownLatch(3)。多线程执行完毕时,触发countdown方法将计数器值减1,当值为0时,主线程中被Latch拴住的代码开始执行。用法一:public class CountDownLatch_v1 { //计数器设为3 static CountDownLatch latch

2020-07-03 13:46:57 835

原创 Java - Atomic类简单小结

背景JAVA中Atomic家族中类型众多,这里列举了一些有代表性的,并对典型的类做简单小结,包括:AtomicInteger/AtomicLongAtomicIntegerArrayAtomicBooleanAtomicReferenceAtomicStampedReference对于上述Atomic家族原子类,共性有:原子性:采用CAS无锁算法,线程互斥访问,多线程安全。可见性:凡是做CAS的变量,必使用Volatile语法,提供可见性支撑。有序性:利用Volatile语法的禁止

2020-07-03 11:50:03 271

原创 Java Singleton单例模式六种实用写法

背景以下列举Singleton模式的5种常见写法,并简要说明。分别是:饿汉式、懒汉式、基本线程安全式、volatile线程安全式、枚举式。饿汉式二话不说上来就实例化。在线程没出现前就已经实例化了,因此饿汉式是线程安全的。只不过上来就实例化会多消耗一丢丢时间。public class Singleton_1 { public int id = 0; public String name = "Singleton_1"; public static Singlet

2020-06-28 15:08:30 587

原创 布隆过滤器中的组合哈希函数

背景之前写过布隆过滤器使用组合哈希函数判定值是否在集合中,这样可以减少内存占用空间,提高空间使用率,具体是怎么做的呢?想了几个简单场景,做个思想实验记录如下。哈希函数与冲突率这里有一点需要强调,不要把哈希函数想成具体的实现,要想成理想化的一个黑盒,就是我指定一个范围(1到N),经过HASH(X)的值等于从范围1到N中的任意值的概率是1/N。设想有一个阵列位(例如一个字节有8个阵列位),可用来存放哈希值,那么:如果阵列位的容量大小是1,那么存放一个哈希值后,再存放新哈希值的冲突概率是100%(实际

2020-06-26 20:50:37 818

原创 互联网常用参数(持续更新......)

常用参数概念TPS(Transaction Per Second)每秒事务数,作为压测指标或衡量高峰业务量忽悠投资人。这个事务的概念比较宽泛,事务可以是执行了DML操作, 也可以是一次业务访问对应的一次DB事务,可以是一次业务请求对应的后台一系列复杂事务,主要看你怎么划分粒度、怎么定义比较合理。QPS(Query Per Second)每秒查询次数,同上…。可以对应一个HTTP REQUEST,一个后台Select操作,相对TPS对应的操作比较纯粹。RT(Response Time)服务响应时间

2020-06-21 17:39:45 421

转载 MESI 协议

背景现代处理器为了提高访问数据的效率,在每个CPU核心上都会有多级容量小,速度快的缓存(L1 cache,L2 cache,多核心共享L3 cache等),用于缓存常用的数据。由于从内存取数据要比从缓存取数据慢近100倍,数据被修改时也只是先更新cache,并不是直接写回到主存中。由此造成了缓存中的数据与内存不一致。如果系统是单核处理器,所有线程看到的都是缓存中的最新数据,当然没有问题。但如果系统是多核处理器,同一份主存数据可能会被缓存到多个核心 cache中,在运行中只要其中一个核心修改了缓存中的值,如

2020-06-21 17:15:17 1093

原创 迭代和递归

背景有一次和同事聊天,提到了迭代和递归,除了上学那会儿,这概念好久不用。突然有点儿懵逼,简单思考记录如下。递归原问题采用分而治之思想,可分解成子问题,且子问题解决的逻辑与原问题一样,但规模更小,采用轮回范式。在程序实现中,递归代码在形式上的体现是:程序自己调用自己。不能无限调用,要有个程序出口。缺点:一般认为性能不好,玩不好会栈(stack)溢出。迭代迭代也叫辗转法,通过一次次的循环,一轮轮的计算,不断用旧值推新值(推陈出新),接近或得到最终结果。个人感觉,迭代中可以分而治之,也可不分

2020-06-21 16:52:49 174

原创 思考内存屏障

背景前一阵在看JAVA中关于Volatile的实现,往下深究引出内存屏障的概念,查了些资料感觉说的模模糊糊,结合其他文章和自己的一些思考,在脑中设计了几个例子,说明问题。概念什么是内存屏障 ?(把欠下的债都结清,然后再开始新的)在CPU层面,CPU会对指令进行重排序以提高运行效率。这里的CPU包括单CPU,多核CPU。在多核多CPU中(单核的不了解而且用的不多不考虑),在某些情况下,这种重排序后的CPU指令乱序执行会导致 “内存的乱序访问”,“内存的乱序访问” 会引发非预期的计算结果。因此,需要引

2020-06-20 18:34:54 383

原创 布隆过滤器浅析

布隆过滤器的一些误解和总结看很多人在网上介绍过布隆过滤器的原理及用法,自己也查了很多资料看,但是总觉得都没说到点儿上、没说到本质,在此总结重新总结布隆过滤器,欢迎指正!待补充功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入看很多人

2020-06-15 13:21:10 162

空空如也

空空如也

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

TA关注的人

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