- 博客(238)
- 资源 (1)
- 收藏
- 关注
原创 从Hadoop框架讨论大数据生态
Hadoop简介 Hadoop是一个分布式系统基础架构,主要解决海量数据的存储和海量数据的分析和计算的问题。从广义上来说,Hadoop通常是指一个更加广泛的概念——Hadoop生态圈。Hadoop的优势高可靠性:Hadoop底层维护着多个数据副本,即时Hadoop某个计算元素或者存储出现故障,也不会导致数据的丢失。高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点。高效性:在MapReduce的思想下,Hadoop是并行工作的,以便加快任务的
2021-04-07 21:58:14 706 1
原创 大数据概论
大数据概念 大数据(Big Data):指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新的处理模式才能具有更强的决策力,洞察力和流程优化能力的海量、高增长率和多样化的信息资产。 大数据技术主要解决的问题:海量数据的存储和分析计算。大数据特点(4V)Volume(大量)Volocity(高速)Variety(多样)Value(低价值密度)大数据应用场景物流仓储:大数据
2021-03-25 22:12:39 423
原创 如何排查一次CPU100%的情况
一、前言 当我们把服务发布到服务器器,可能会因为一些问题造成我们的服务器CPU被打满甚至超过100%,那如果我们想知道到底上在做什么操作导致CPU持续过高呢?因为在线上,我们只能通过日志看问题,或者排查到哪个进程或者哪个线程持续占用CPU。然后才能找到具体问题在哪里才能进行解决。所以这里我们模拟一个死循环导致CPU过高的情况,然后如何快速的找到问题在哪。二、问题代码案列我们这里只是写了一段死循环的代码,我们把它放到服务器上门直接用java命令跑起来。p
2020-10-19 23:03:10 2771
原创 什么是享元模式?
一、前言 享元模式是构造型模式之一,它通过共享数据使得相同对象在内存中仅创建一个实例,以降低系统创建对象实例的性能消耗。 以博客里写文章为例来说吧,把文章和文章中的文字看作对象,我们每在博客里写一个字就相当于是创建一个文字对象,假如我们写的文章有一万个字,那我们岂不是要创建一万次文字对象,如此频繁的创建对象势必会严重拖累系统的性能。 享元模式通过数据共享使得重复使用
2020-10-15 09:40:48 849 1
原创 如何保障MySQL和redis缓存的一致性
一、问题分析 众所周知,数据库是把数据存储在磁盘上,访问时需要进行IO操作,在请求量小的情况下,耗时还比较低。但随着数据量的增大,访问量的集中,整个数据库负担加重,响应就会变慢,请求延时上升。进而导致用户侧的等待时间变长,很大程度上影响了用户体验。 为了解决这一问题,在整个请求链路上就引入了缓存的策略,将数据库中的数据copy一份到redis缓存(毕竟可是号称单机抗10w qps)。由于redis的数据是直接存在
2020-09-29 19:14:20 476 1
转载 深入浅出索引(下)
一、前言 在上一篇文章中,我和你介绍了 InnoDB 索引的数据结构模型,今天我们再继续聊聊跟 MySQL 索引有关的概念。二、在开始这篇文章之前,我们先来看一下这个问题? 在下面这个表 T 中,如果我执行 select * from T where k between 3 and 5,需要执行几次树...
2020-08-30 11:37:11 132
原创 深入浅出索引(上)
一、前言 提到数据库索引,我想你并不陌生,在日常工作中会经常接触到。比如某一个 SQL 查询比较慢,分析完原因之后,你可能就会说“给某个字段加个索引吧”之类的解决方案。但到底什么是索引,索引又是如何工作的呢?今天就让我们一起来聊聊这个话题吧。 一句话简单来说,索引的出现其实就是为了提高数据查询的效率,就...
2020-08-30 11:16:57 156 1
原创 一条SQL查询语句是如何执行的?
一、前言 我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于 MySQL 的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表里只有一个 ID 字段,在执行下面这个查询语句时:mysql> select * from T where ID=10;&...
2020-08-30 10:42:58 164
原创 一条SQL更新语句是如何执行的?
一、前言 前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。 那么,一条更新语句的执行流程又是怎样的呢? 之前你可能经常听 ...
2020-08-30 09:08:23 145
原创 事务到底是隔离的还是不隔离的?
一、前言 我在前面文章和你讲事务隔离级别的时候提到过,如果是可重复读隔离级别,事务 T 启动的时候会创建一个视图 read-view,之后事务 T 执行期间,即使有其他事务修改了数据,事务 T 看到的仍然跟在启动时看到的一样。也就是说,一个在可重复读隔离级别下执行的事务,好像与世无争,不受外界影响。 但...
2020-08-29 21:56:02 188
原创 MySQL为什么有时候会选错索引?
一、前言 前面我们介绍过索引,你已经知道了在 MySQL 中一张表其实是可以支持多个索引的。但是,你写 SQL 语句的时候,并没有主动指定使用哪个索引。也就是说,使用哪个索引是由 MySQL 来确定的。 不知道你有没有碰到过这种情况,一条本来可以执行得很快的语句,却由于 MySQL 选错了索引,而导致执...
2020-08-29 15:06:20 168
原创 “order by”是怎么工作的?
一、前言 在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求。还是以我们前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 个人的姓名、年龄。 假设这个表的部分定义是这样的:CREATE TABLE `t` ( `id` int...
2020-08-29 14:35:06 130
原创 自增id用完怎么办?
一、前言 MySQL 里有很多自增的 id,每个自增 id 都是定义了初始值,然后不停地往上加步长。虽然自然数是没有上限的,但是在计算机里,只要定义了表示这个数的字节长度,那它就有上限。比如,无符号整型 (unsigned int) 是 4 个字节,上限就是 232-1。 既然自增 id 有上限,就有可...
2020-08-29 10:40:24 697
原创 Zookeeper分布式锁原理
一、架构介绍 在介绍使用Zookeeper实现分布式锁之前,首先看当前的系统架构图。 解释:左边的整个区域表示一个Zookeeper集群,locker是Zookeeper的一个持久节点,node_1、node_2、node_3是locker这个持久节点下面的临时顺序节点。client_1、client_2、client_n表示多个客户端,Service表示需要互斥访问的共享资源。二、分布式锁获取思路总体思路
2020-08-20 17:10:41 247 1
原创 Redis分布式锁原理
一、分布式锁原理 分布式锁,是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。使用setnx、getset、expire、del这4个redis命令实现:setnx 是『SET if Not eXists』的简写。 命令格式:SETNX key value
2020-08-20 16:50:55 447
原创 Volatile原理解析
一、实现原理 对于volatile的解释,我相信更直白的说就是对于一个被volatile关键字修饰的变量,在并发情况下Java内存模型(JMM)保证每个线程对该变量的可见性,保证他们读取的数据是一致的,因此volatile实现了数据的可见性,有序性,但不保证原子性(下文会详细解释)。但是怎样保证可见性的呢?在jvm底层对于volatile修饰的共享变量进行写操作的时候主要实现了两个步骤:将当前处理器缓存行的数据写回到系统内存;将其他处理器中缓存了该数据的
2020-08-20 16:17:13 4967 2
原创 基于MySQL实现的分布式锁
一、前言 在单机时代,虽然不需要分布式锁,但也面临过类似的问题,只不过在单机的情况下,如果有多个线程要同时访问某个共享资源的时候,我们可以采用线程间加锁的机制,即当某个线程获取到这个资源后,就立即对这个资源进行加锁,当使用完资源之后,再解锁,其它线程就可以接着使用了。例如,在JAVA中,甚至专门提供了一些处理锁机制的一些API(synchronize/Lock等)。 但是到了分布式系统的时代,这种线程之间的锁机制
2020-08-20 15:20:12 1317 1
原创 Synchronized原理解析
一、为什么出现synchronized 对于程序员而言,不管是在平常的工作中还是面试中,都会经常用到或者被问到synchronized。在多线程并发编程中,synchronized早已是元老级的角色了,很多人都称其为重量级锁,但是随着Java SE 1.6对其进行各种优化之后,便显得不再是那么的重了,原因下面就讲。正是因为多线程并发的出现,便产生了线程安全这样的问题,对于线程安全的主要原因如下:存在共享数据(也称临界资源);存在多条线程共同操作这些共享
2020-08-20 11:12:38 608
原创 Objects
一、前言 Objects是自jdk1.7起新增的工具类,这个类由一些实用的静态方法组成,这些方法可以方便我们平时的开发,例如对象比较、获取对象的hash码等。二、源码解析继承了哪些类由上图可知Objects没有继承的父类(除了Object以外)或者实现的接口。构造方法/** * 通过私有化构造器强化不可实例化的能力。 */private Objects() { throw new AssertionError("No java.uti
2020-07-31 16:38:39 312
原创 Integer源码解析
一、前言 Integer类是我们经常用到的一个基础类,学习其底层结构有助于我们在项目中更加得心应手的使用他,并且能够有效避免Integer所遇到的坑。这篇博客主要是介绍Integer经常使用的几个方法其源码是怎么做的,而且针对Integer的一些变量进行解释,这会有助于我们读懂Integer的源码。二、源码解析继承了哪些类 由上图可知Integer继承了Number抽象类和实现了Comparable接口。
2020-07-29 16:32:39 588
原创 Object类中的registerNatives本地方法的作用
一、简介 在阅读JDK源码的时候,细心的你可能会发现,不光是Object类,甚至System类、Class类、ClassLoader类、Unsafe类等等,都能在类代码中找到如下代码:private static native void registerNatives();static { registerNatives();}二、提出问题什么是本地方法? Java有两种方法:Java方法和本
2020-07-28 16:43:41 1001
原创 什么是责任链模式?
一、定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式。二、角色Handler(抽象处理者): 定义了一个处理请求的接口,一般设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了抽象请求处理方法。因为每一个处理者的下家还是一个处理者,因此在抽象处理者中定义了一个抽象处理者类型
2020-07-28 14:43:04 3972
原创 什么是迭代器模式?
一、定义 迭代器(Iterator)模式又叫作游标(Cursor)模式,是一种对象的行为模式。提供一种方法顺序访问一个聚合(指一组对象的组合结构,如:Java中的集合、数组等)对象中各个元素,而又不需暴露该对象的内部表示。迭代器模式的本质:控制访问聚合对象中的元素。其设计意图:无须暴露聚合对象的内部实现,就能够访问到聚合对象中的各个元素。二、角色抽象迭代器(Iterator)角色: 一般定义为接口,用来定义访问和遍历元素的接口。具体迭代器(Concret
2020-07-24 16:55:20 1863
原创 Java中的boolean类型到底占用多少个字节?
一、什么是boolean类型? 布尔类型:布尔数据类型只有两个可能的值:真和假。使用此数据类型为跟踪真/假条件的简单标记。这种数据类型就表示这一点信息,但是它的“大小”并不是精确定义的。也就是说,Java规范中,没有明确指出boolean的大小。二、如果要分大小,那么到底占几个字节呢? 通过搜查各类资料(借鉴了一些大神的内容),发现有以下3种说法。1个bit(1/8个字节)  
2020-07-24 14:11:54 786
原创 用HTTPS就安全了?
一、HTTPS 的实现原理 大家可能都听说过 HTTPS 协议之所以是安全的是因为 HTTPS 协议会对传输的数据进行加密,而加密过程是使用了非对称加密实现。但其实,HTTPS在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。 HTTPS的整体过程分为证书验证和数据传输阶段,具体的交互过程如下:① 证书验证阶段浏览器发起 HTTPS 请求;服务端返回 HTTPS 证书;客户端验证证书
2020-07-22 17:51:51 175
原创 JDK动态代理实现原理
一、动态代理机制通过实现 InvocationHandler 接口创建自己的调用处理器;通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。二、代码示例1.HelloService 接口。public interface HelloService { void sayHello();}2
2020-07-22 15:20:54 175
原创 Java反射机制的原理
一、什么是反射? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。二、反射的特性运行时生成对象实例;运行时调用方法;运行时更改属性。三、反射机制获取类的方法1.对象调用 getClass() 方法来获取。Person p1 = new Person();Class c1 = p1.g
2020-07-22 14:14:18 320
原创 JDBC的连接步骤
JDBC的连接步骤1.JDBC所需的四个参数user:用户名;password:密码;URL:定义了连接数据库时的协议、子协议、数据源标识。(书写形式:协议:子协议:数据源标识);(1). 协议:在JDBC中总是以jdbc开始;(2). 子协议:是桥连接的驱动程序或是数据库管理系统名称;(3). 数据源标识:标记找到数据库来源的地址与连接端口;driverClass连接数据库所需的驱动。2.加载JDBC驱动程序 在连接数据库之前,首先要加
2020-07-22 10:47:26 549
原创 为什么使用构造注入而不是@Autowired
一、前言 使用Spring开发时,我们通常有两种依赖注入的方式,基于注解@Autowired的依赖注入和基于构造函数的依赖注入。用IDEA开发过程中,如果使用@Autowired注入,通常会有如下警告:Inspection info: Spring Team recommends: "Always use constructor based dependency injection in your beans. Always use assertions
2020-07-01 18:02:16 2932 2
原创 Redis的对象底层实现
一、前言 Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到了至少一种我们前面所介绍的数据结构。 通过这五种不同类型的对象,Redis可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令。使用对象的另一个好处是,我们可以针对不同的使用场景,为对象设置多种
2020-05-13 09:41:08 208
原创 Redis的字典底层实现
一、前言 字典,又称为符号表(sy mbol table)、关联数组(associative array )或映射(map),是一种用于保存键值对(key -value pair)的抽象数据结构。在字典中,一个键(key )可以和一个值(value)进行关联(或者说将键映射为值),这些关联的键和值就称为键值对。 字典中的每个键都是独一无二的,程序可以在字典中根据键查找与之关联的值,或者通过键来更新值,又或者根据键
2020-05-11 15:36:57 647 1
原创 Redis的整数集合底层原理
一、前言 整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。 举个例子,如果我们创建一个只包含五个元素的集合键,并且集合中的所有元素都是整数值,那么这个集合键的底层实现就会是整数集合:redis&g...
2020-05-08 15:26:22 269
原创 Redis的跳跃表底层原理
一、前言 跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点。 在大部分情况下,跳跃表的效率可以和平衡树相媲美,并且因为跳跃表的实现比平衡树...
2020-05-08 10:46:08 3659
原创 Redis的链表底层原理
一、前言 链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。 作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用的C语言并没有内置这种数据结构,所以Redis构建了自己的链表实现。二、链表的使用场景 &n...
2020-05-07 16:16:36 430
原创 Redis的简单动态字符串(SDS)
一、前言 Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串(simple dy namic string,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。 在Redis里面,C字符串只会作为字符串字面量(stri...
2020-05-07 10:43:59 349 1
原创 ThreadPoolExecutor源码解析
一、前言 在《阿里巴巴开发手册》中有对针对线程池的使用有着明确的要求,原文如下:【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样 的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors 返回的线程池对象的弊端如下: 1)FixedThread...
2020-04-15 16:10:33 329
原创 ReentrantLock源码解析
一、简介 使用了AQS的独占获取和释放,用state变量记录某个线程获取独占锁的次数,获取锁时+1,释放锁时-1,在获取时会校验线程是否可以获取锁。ReentrantLock类实现了Lock接口,并提供了与synchronized相同的互斥性和内存可见性,它的底层是通过AQS 来实现多线程同步的。与内置锁相比ReentrantLock不仅提供了更丰富...
2020-04-12 16:58:34 171
原创 AQS(AbstractQueuedSynchronizer)源码解析
一、简介 AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)是用来构建锁或者其他同步 组件(信号量、事件等)的基础框架类。JDK中许多并发工具类的内部实现都依赖于AQS,如ReentrantLock, Semaphore, CountDownLatch等等。学习AQS的使用与源码实现对...
2020-04-12 15:13:10 405
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人