- 博客(108)
- 收藏
- 关注
原创 LockSupport
javadoc用于创建锁和其他同步类的基本线程阻塞原语。这个类与每个使用它的线程相关联,一个许可证(在Semaphore类的意义上)。如果许可证可用,则呼叫park将park返回,在此过程中消耗它;否则可能会阻止。调用unpark使许可证可用,如果尚不可用。(与信号量不同,许可证不能累积,最多只有一个。)方法park和unpark提供了阻止和解除阻塞线程的有效手段,该方法不会遇到导致不推荐使用的方法Thread.suspend和Thread.resume目的不能使用的问题:一个...
2021-05-06 16:17:40
289
转载 常见代码重构技巧(非常实用)
常见代码重构技巧关于重构为什么要重构项目在不断演进过程中,代码不停地在堆砌。如果没有人为代码的质量负责,代码总是会往越来越混乱的方向演进。当混乱到一定程度之后,量变引起质变,项目的维护成本已经高过重新开发一套新代码的成本,想要再去重构,已经没有人能做到了。造成这样的原因往往有以下几点:编码之前缺乏有效的设计 成本上的考虑,在原功能堆砌式编程 缺乏有效代码质量监督机制对于此类问题,业界已有有很好的解决思路:通过持续不断的重构将代码中的“坏味道”清除掉。什么是重构重构一书的
2021-05-06 12:31:24
1844
原创 AQS 源码解读
1.先看一下类图2.开始跟代码找一个入口new ReentrantLock()默认是非公平锁,false是非公平进入lock.lock(),在ReentrantLock中的实现看到是sync的lock方法 Sync是ReentrantLock的子类找抽象方法lock()在非公平锁中的实现compareAndSetState(0,1) 如果状态是0 更新为 1setExclusiveOwnerThread(Thread.currentThr...
2021-04-18 12:30:59
265
转载 面试官问:ZooKeeper是强一致的吗?怎么实现的?
Zookeeper通过ZAB保证分布式事务的最终一致性。ZAB全称Zookeeper Atomic Broadcast(ZAB,Zookeeper原子消息广播协议) ZAB是一种专门为Zookeeper设计的一种支持崩溃恢复的原子广播协议,是Zookeeper保证数据一致性的核心算法。ZAB借鉴了Paxos算法,但它不是通用的一致性算法,是特别为Zookeeper设计的。 基于ZAB协议,Zookeeper实现了⼀种主备模式的系统架构来保持集群中各副本之间的数据的⼀致性,表现形式...
2021-01-20 19:27:21
418
原创 02.Netty入门-架构设计
上节回顾:I/O的四种模型同步阻塞IO模型 同步非阻塞IO模型 IO多路复用模型 异步IO模型————————————————————————————————————————————————————————————1、基本线程模型介绍 目前存在的线程模型 传统阻塞I/O服务模型 Reactor模式 线程模型-Reactor模式 单Reactor-单线程 单Reactor-多线程 主从Reactor-多线程 Netty线程模型 Ne
2021-01-08 15:19:34
158
原创 MySQL InnoDB In-Memory Structures Buffer Pool
官方文档:https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool.htmlBuffer Pool缓冲池是主内存中的一个区域,在InnoDB访问表和索引数据时会在其中进行高速缓存。缓冲池允许直接从内存中处理经常使用的数据,从而加快了处理速度。在专用服务器上,通常将多达80%的物理内存分配给缓冲池。为了提高大容量读取操作的效率,缓冲池被分为多个页面,这些页面可能包含多个行。为了提高缓存管理的效率,缓冲池被实现为页面的链接列表...
2020-12-18 15:05:11
119
原创 01.Netty入门-IO模型浅析
写在前面很多的小伙伴,被java IO 模型,搞得有点儿晕,一会儿是4种模型,一会儿又变成了5种模型。很多的小伙伴,也被nio这个名词搞晕了,一会儿java 的nio 不叫 非阻塞io,一会儿java nio 又是非阻塞io,到底是啥呢?很多的小伙伴,被异步和非阻塞搞晕了。都非阻塞了,难道不是异步的吗?这这,好难呀。此文,给各位小伙伴,起底一下,java的四大IO模型。1.1. Java IO读写原理无论是Socket的读写还是文件的读写,在Java层面的应用开发或者是linux系统
2020-12-01 20:18:22
114
转载 Lucene解析 - IndexWriter
前言在上一篇文章我们介绍了Lucene的基本概念,在本篇文章我们将深入Lucene中最核心的类之一IndexWriter,来探索Lucene中数据写入和索引构建的整个过程。IndexWriter// initializationDirectory index = new NIOFSDirectory(Paths.get("/index"));IndexWriterConfig config = new IndexWriterConfig();IndexWriter writer = ne
2020-11-25 10:02:05
670
转载 Lucene 查询原理
前言Lucene 是一个基于 Java 的全文信息检索工具包,目前主流的搜索系统Elasticsearch和solr都是基于lucene的索引和搜索能力进行。想要理解搜索系统的实现原理,就需要深入lucene这一层,看看lucene是如何存储需要检索的数据,以及如何完成高效的数据检索。在数据库中因为有索引的存在,也可以支持很多高效的查询操作。不过对比lucene,数据库的查询能力还是会弱很多,本文就将探索下lucene支持哪些查询,并会重点选取几类查询分析lucene内部是如何实现的。为了方便大家理
2020-11-25 09:59:09
435
转载 Lucene解析 - 基本概念
前言Apache Lucene是一个开源的高性能、可扩展的信息检索引擎,提供了强大的数据检索能力。Lucene已经发展了很多年,其功能越来越强大,架构也越来越精细。它目前不仅仅能支持全文索引,也能够提供多种其他类型的索引方式,来满足不同类型的查询需求。基于Lucene的开源项目有很多,最知名的要属Elasticsearch和Solr,如果说Elasticsearch和Solr是一辆设计精美、性能卓越的跑车,那Lucene就是为其提供强大动力的引擎。为了驾驭这辆跑车让它跑的更快更稳定,我们需要对它的引
2020-11-25 09:56:00
400
转载 Elasticsearch内核解析 - 查询篇
读操作实时性和《Elasticsearch内核解析 - 写入篇》中的“写操作”一样,对于搜索而言是近实时的,延迟在100ms以上,对于NoSQL则需要是实时的。一致性指的是写入成功后,下次读操作一定要能读取到最新的数据。对于搜索,这个要求会低一些,可以有一些延迟。但是对于NoSQL数据库,则一般要求最好是强一致性的。结果匹配上,NoSQL作为数据库,查询过程中只有符合不符合两种情况,而搜索里面还有是否相关,类似于NoSQL的结果只能是0或1,而搜索里面可能会有0.1,0.5,0.9等部分匹配或者
2020-11-25 09:50:21
408
转载 Elasticsearch内核解析 - 写入篇
目前的Elasticsearch有两个明显的身份,一个是分布式搜索系统,另一个是分布式NoSQL数据库,对于这两种不同的身份,读写语义基本类似,但也有一点差异。写操作实时性: 搜索系统的Index一般都是NRT(Near Real Time),近实时的,比如Elasticsearch中,Index的实时性是由refresh控制的,默认是1s,最快可到100ms,那么也就意味着Index doc成功后,需要等待一秒钟后才可以被搜索到。 NoSQL数据库的Write基本都是RT(Real Tim
2020-11-25 09:46:53
336
转载 Elasticsearch内核解析 - 数据模型篇
Elasticsearch是一个实时的分布式搜索和分析引擎,它可以帮助我们用很快的速度去处理大规模数据,可以用于全文检索、结构化检索、推荐、分析以及统计聚合等多种场景。Elasticsearch是一个建立在全文搜索引擎库Apache Lucene 基础上的分布式搜索引擎,Lucene最早的版本是2000年发布的,距今已经18年,是当今最先进,最高效的全功能开源搜索引擎框架,众多搜索领域的系统都基于Lucene开发,比如Nutch,Solr和Elasticsearch等。Elasticsearch第一个版
2020-11-24 20:44:43
523
转载 从Elasticsearch来看分布式系统架构设计
分布式系统类型多,涉及面非常广,不同类型的系统有不同的特点,批量计算和实时计算就差别非常大。这篇文章中,重点会讨论下分布式数据系统的设计,比如分布式存储系统,分布式搜索系统,分布式分析系统等。我们先来简单看下Elasticsearch的架构。Elasticsearch 集群架构Elasticsearch是一个非常著名的开源搜索和分析系统,目前被广泛应用于互联网多种领域中,尤其是以下三个领域特别突出。一是搜索领域,相对于solr,真正的后起之秀,成为很多搜索系统的不二之选。二是Json文档数据库,
2020-11-24 20:41:07
113
转载 《我要进大厂》- MQ夺命连环11问
你们为什么使用mq?具体的使用场景是什么?mq的作用很简单,削峰填谷。以电商交易下单的场景来说,正向交易的过程可能涉及到创建订单、扣减库存、扣减活动预算、扣减积分等等。每个接口的耗时如果是100ms,那么理论上整个下单的链路就需要耗费400ms,这个时间显然是太长了。如果这些操作全部同步处理的话,首先调用链路太长影响接口性能,其次分布式事务的问题很难处理,这时候像扣减预算和积分这种对实时一致性要求没有那么高的请求,完全就可以通过mq异步的方式去处理了。同时,考虑到异步带来的不一致的问题,我们可以
2020-11-24 18:15:08
472
转载 《我要进大厂》- Redis夺命连环11问
说说Redis基本数据类型有哪些吧 字符串:redis没有直接使用C语言传统的字符串表示,而是自己实现的叫做简单动态字符串SDS的抽象类型。C语言的字符串不记录自身的长度信息,而SDS则保存了长度信息,这样将获取字符串长度的时间由O(N)降低到了O(1),同时可以避免缓冲区溢出和减少修改字符串长度时所需的内存重分配次数。 链表linkedlist:redis链表是一个双向无环链表结构,很多发布订阅、慢查询、监视器功能都是使用到了链表来实现,每个链表的节点由一个listNode结构来表示,每个
2020-11-24 18:13:13
264
1
转载 《我要进大厂》- Dubbo普普通通9问
Dubbo本身并不复杂,而且官方文档写的非常清楚详细,面试中dubbo的问题一般不会很多,从分层到工作原理、负载均衡策略、容错机制、SPI机制基本就差不多了,最大的一道大题一般就是怎么设计一个RPC框架了,但是如果你工作原理分层都搞明白了这个问题其实也就相当于回答了不是吗。说说Dubbo的分层?从大的范围来说,dubbo分为三层,business业务逻辑层由我们自己来提供接口和实现还有一些配置信息,RPC层就是真正的RPC调用的核心层,封装整个RPC的调用过程、负载均衡、集群容错、代理,remoti
2020-11-24 18:11:42
99
转载 《我要进大厂》-JVM夺命连环10问
说说JVM的内存布局?Java虚拟机主要包含几个区域:堆:堆Java虚拟机中最大的一块内存,是线程共享的内存区域,基本上所有的对象实例数组都是在堆上分配空间。堆区细分为Yound区年轻代和Old区老年代,其中年轻代又分为Eden、S0、S1 3个部分,他们默认的比例是8:1:1的大小。栈:栈是线程私有的内存区域,每个方法执行的时候都会在栈创建一个栈帧,方法的调用过程就对应着栈的入栈和出栈的过程。每个栈帧的结构又包含局部变量表、操作数栈、动态连接、方法返回地址。局部变量表用于存储方法参数和
2020-11-24 18:10:04
101
转载 《我要进大厂》- Java基础夺命连环16问
说说进程和线程的区别?进程是程序的一次执行,是系统进行资源分配和调度的独立单位,他的作用是是程序能够并发执行提高资源利用率和吞吐率。由于进程是资源分配和调度的基本单位,因为进程的创建、销毁、切换产生大量的时间和空间的开销,进程的数量不能太多,而线程是比进程更小的能独立运行的基本单位,他是进程的一个实体,可以减少程序并发执行时的时间和空间开销,使得操作系统具有更好的并发性。线程基本不拥有系统资源,只有一些运行时必不可少的资源,比如程序计数器、寄存器和栈,进程则占有堆、栈。知道synchroni
2020-11-24 18:06:58
241
转载 推荐超详细的5个Shell脚本实例
1、定时清空文件内容,定时记录文件大小#!/bin/bash#################################################################每小时执行一次脚本(任务计划),当时间为0点或12点时,将目标目录下的所有文件内#容清空,但不删除文件,其他时间则只统计各个文件的打小,一个文件一行,输出到以时#间和日期命名的文件中,需要考虑目标目录下二级、三级等子目录的文件#########################################
2020-11-24 17:17:59
373
转载 Kafka从入门到原理
目录一、kafka概述1.1、定义1.2、消息队列1.2.1、传统的消息队列&新式的消息队列的模式1.2.2、使用消息队列的好处1.2.3、消息队列的模式1.3、kafka的基础架构1.4、kafka安装1.5、启动kafka1.6、kafka操作1.7、启动生产者生产消息,kafka自带一个生产者和消费者的客户端二、kafka架构深入2.1、kafka的工作流程2.2、kafka原理三、kafka的生产者和消费者3.1、kafk.
2020-11-24 11:02:03
298
转载 消息队列(进阶篇)- 如何使用异步设计提升系统性能?
对于开发者来说,异步是一种程序设计的思想,使用异步模式设计的程序可以显著减少线程等待,从而在高吞吐量的场景中,极大提升系统的整体性能,显著降低时延。因此,像消息队列这种需要超高吞吐量和超低时延的中间件系统,在其核心流程中,一定会大量采用异步的设计思想。接下来,我们一起来通过一个非常简单的例子学习一下,使用异步设计是如何提升系统性能的。异步设计如何提升系统性能?假设我们要实现一个转账的微服务 Transfer( accountFrom, accountTo, amount),这个服务有三个参数
2020-11-16 11:37:36
615
原创 怎么快速清晰地和老板对话
一般的管理学,会教你著名的电梯测试,也就是假设你在电梯间遇到大老板,怎么在30秒内,他下电梯之前,清晰准确地让对方听明白你的话。做法就是你要学会结构化思考,拎出自己的核心观点,再行动。但是到底怎么说怎么做,可能你即便是看过麦肯锡的书,也还是不会操作。别担心,接下来手把手教你的。我们这里就有这么一个问题是:「茶水间遇到大老板,他停下来问我“最近怎么样”, 我应该怎么回答?」这是茶水间,一个更日常化的场景,老板发问了你该怎么说。反正我自己每天早上打水时,遇到XXX老板,是很紧张的,而且他本身体型又大,很容易
2020-11-01 13:31:04
427
转载 延时队列实现的几种方式
在开发中,往往会遇到一些关于延时任务的需求。例如 生成订单30分钟未支付,则自动取消 生成订单60秒后,给用户发短信 对上述的任务,我们给一个专业的名字来形容,那就是延时任务。那么这里就会产生一个问题,这个延时任务和定时任务的区别究竟在哪里呢?一共有如下几点区别1、 定时任务有明确的触发时间,延时任务没有2、 定时任务有执行周期,而延时任务在某事件触发后一段时间内执行,没有执行周期3、 定时任务一般执行的是批处理操作是多个任务,而延时任务一般是单个任务下面,我们以判断订单
2020-10-26 15:30:16
1389
2
原创 如何画UML类图
简单介绍统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,面向对象的建模语言的国际标准。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。类、接口、类图类类(Class)是指具有相同属性、方法和关系的对象的抽象,它封装了数据和行为,是面向对象程序设计(OOP)的基础,具有封装性、继承性和多态性等三大特性。在 UML 中,类使用包含类名、属性和操作且带有分隔线的矩形来表示。类名类名(Name)是一个字符串,例如,
2020-10-23 15:10:19
41758
4
转载 消息队列(基础篇)- 7 消息积压了该如何处理
我们都知道,消息积压的直接原因,一定是系统中的某个部分出现了性能问题,来不及处理上游发送的消息,才会导致消息积压。所以,我们先来分析下,在使用消息队列时,如何来优化代码的性能,避免出现消息积压。然后再来看看,如果你的线上系统出现了消息积压,该如何进行紧急处理,最大程度地避免消息积压对业务的影响。优化性能来避免消息积压在使用消息队列的系统中,对于性能的优化,主要体现在生产者和消费者这一收一发两部分的业务逻辑中。对于消息队列本身的性能,你作为使用者,不需要太关注。为什么这么说呢?主要原因是,对于
2020-10-16 10:27:56
2536
1
转载 消息队列(基础篇)-6 如何处理消费过程中的重复消息
在消息传递过程中,如果出现传递失败的情况,发送方会执行重试,重试的过程中就有可能会产生重复的消息。对使用消息队列的业务系统来说,如果没有对重复消息进行处理,就有可能会导致系统的数据出现错误。比如说,一个消费订单消息,统计下单金额的微服务,如果没有正确处理重复消息,那就会出现重复统计,导致统计结果错误。你可能会问,如果消息队列本身能保证消息不重复,那应用程序的实现不就简单了?那有没有消息队列能保证消息不重复呢?消息重复的情况必然存在在 MQTT 协议中,给出了三种传递消息时能够提供的服务质量标
2020-10-16 10:19:52
963
1
原创 系统CPU飙高和频繁GC问题查询思路
处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。本文主要针对系统运行缓慢这一问题,提供该问题的排查思路,从而定位出问题的代码点,进而提供解决该问题的思路。对于线上系统突然产生的运行缓慢问题,如果该问题导致线上系统不可用,那么首先需要做的就是,导出jstack和内存信息,然后重启系统,尽快保证系统的可用性。这种情况可能的原因主要有两种:代码中某个位置读取数据量较大,导致系统内存
2020-10-15 11:03:17
574
转载 消息队列(基础篇)-5 如何确保消息不会丢失?
其实,现在主流的消息队列产品都提供了非常完善的消息可靠性保证机制,完全可以做到在消息传递过程中,即使发生网络中断或者硬件故障,也能确保消息的可靠传递,不丢消息。绝大部分丢消息的原因都是由于开发者不熟悉消息队列,没有正确使用和配置消息队列导致的。虽然不同的消息队列提供的 API 不一样,相关的配置项也不同,但是在保证消息可靠传递这块儿,它们的实现原理是一样的。这节课我们就来讲一下,消息队列是怎么保证消息可靠传递的,这里面的实现原理是怎么样的。当你熟知原理以后,无论你使用任何一种消息队列,再简单看一下它
2020-10-11 17:41:35
1691
转载 消息队列(基础篇)-4 如何利用事务消息实现分布式事务?
很多场景下,我们“发消息”这个过程,目的往往是通知另外一个系统或者模块去更新数据,消息队列中的“事务”,主要解决的是消息生产者和消息消费者的数据一致性问题。依然拿我们熟悉的电商来举个例子。一般来说,用户在电商 APP 上购物时,先把商品加到购物车里,然后几件商品一起下单,最后支付,完成购物流程,就可以愉快地等待收货了。这个过程中有一个需要用到消息队列的步骤,订单系统创建订单后,发消息给购物车系统,将已下单的商品从购物车中删除。因为从购物车删除已下单商品这个步骤,并不是用户下单支付这个主要流程中必需的
2020-10-11 17:23:43
960
2
转载 消息队列(基础篇)- 3 主题和队列有什么区别
主题和队列有什么区别?在互联网的架构师圈儿中间,流传着这样一句不知道出处的名言,我非常认同和喜欢:好的架构不是设计出来的,而是演进出来的。 现代的消息队列呈现出的模式,一样是经过之前的十几年逐步演进而来的。最初的消息队列,就是一个严格意义上的队列。在计算机领域,“队列(Queue)”是一种数据结构,有完整而严格的定义。在维基百科中,队列的定义是这样的:队列是先进先出(FIFO, First-In-First-Out)的线性表(Linear List)。在具体应用中通常用链表或者数组来实现。队列
2020-10-10 23:11:01
920
2
转载 消息队列(基础篇)-2 该如何选择消息队列
选择消息队列产品的基本标准开源 活跃度高 满足技术要求可供选择的消息队列产品1. RabbitMQ首先,我们说一下老牌儿消息队列 RabbitMQ,俗称兔子 MQ。RabbitMQ 是使用一种比较小众的编程语言:Erlang 语言编写的,它最早是为电信行业系统之间的可靠通信设计的,也是少数几个支持 AMQP 协议的消息队列之一。RabbitMQ 就像它的名字中的兔子一样:轻量级、迅捷,它的 Slogan,也就是宣传口号,也很明确地表明了 RabbitMQ 的特点:Messaging t
2020-10-10 23:02:53
345
转载 消息队列(基础篇)-1 为什么需要消息队列?
解决实际工作中的问题异步处理大多数程序员在面试中,应该都问过或被问过一个经典却没有标准答案的问题:如何设计一个秒杀系统?这个问题可以有一百个版本的合理答案,但大多数答案中都离不开消息队列。秒杀系统需要解决的核心问题是,如何利用有限的服务器资源,尽可能多地处理短时间内的海量请求。我们知道,处理一个秒杀请求包含了很多步骤,例如:风险控制; 库存锁定; 生成订单; 短信通知; 更新统计数据。如果没有任何优化,正常的处理流程是:App 将请求发送给网关,依次调用上述 5 个流程,然后将结果
2020-10-10 22:56:06
365
原创 消息队列(基础篇)-0 准备
门槛 熟练使用各种常用集合,比如:数组、链表、字典等; 掌握 Linux 系统的基础知识,会使用常用的命令; 具备多线程、并发控制编程能力; 编写过读写文件、通过网络收发数据的程序; 能看懂最基本的 UML 图,包括类图、时序图等; 了解最常用的几种设计模式和算法。 知识图谱 相关文档 RocketMQ 官方文档: https://rocketmq.apache.org/docs/quick-start/ RocketM.
2020-10-10 15:33:24
132
转载 ConcurrentHashMap 的分析和使用
ConcurrentHashMap 是线程安全并且高效的 HashMap。本节让我们一起研究下该容器是如何在保证线程安全的同时又能保证高效的操作。目录为什么要使用 ConcurrentHashMapConcurrentHashMap 的锁分段技术ConcurrentHashMap 的结构ConcurrentHashMap 的初始化定位 SegmentConcurre...
2019-03-15 10:23:34
265
原创 windows python3.7 和 Scrapy环境 搭建
下载python3.7:https://www.python.org/downloads/release/python-371/ 安装 --点下一步下一步-->ok运行:pip install Scrapy 报错: error:信息,发现安装前需要有Visual C++去:https://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载...
2018-12-05 17:39:48
210
转载 Java-RandomAccessFile-实现文件随机读写
现有如下的一个需求,向已存在1G数据的txt文本里末尾追加一行文字,内容如下“Lucene是一款非常优秀的全文检索库”。可能大多数朋友会觉得这个需求很easy,说实话,确实easy,然后XXX君开始实现了,直接使用Java中的流读取了txt文本里原来所有的数据转成字符串后,然后拼接了“Lucene是一款非常优秀的全文检索库”,又写回文本里了,至此,大功告成。后来需求改了,向5G数据的txt文本里追...
2018-12-04 17:52:09
621
转载 MySQL执行计划解析
前言在实际数据库项目开发中,由于我们不知道实际查询时数据库里发生了什么,也不知道数据库是如何扫描表、如何使用索引的,因此,我们能感知到的就只有SQL语句的执行时间。尤其在数据规模比较大的场景下,如何写查询、优化查询、如何使用索引就显得很重要了。那么,问题来了,在查询前有没有可能估计下查询要扫描多少行、使用哪些索引呢?答案是肯定的。以MySQL为例,MySQL通过explain命令输出执...
2018-11-27 14:45:24
200
原创 SQL优化4 - 常用 SQL 的优化
前面我们介绍了 MySQL 中怎么样通过索引来优化查询。日常开发中,除了使用查询外,我们还会使用一些其他的常用 SQL,比如 INSERT、GROUP BY 等。对于这些 SQL 语句,我们该怎么样进行优化呢?4.1 大批量插入数据当用 load 命令导入数据的时候,适当的设置可以提高导入的速度。对于 MyISAM 存储引擎的表,可以通过以下方式快速的导入大量的数据。ALTER TA...
2018-11-27 14:43:02
220
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人