自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(245)
  • 资源 (2)
  • 收藏
  • 关注

原创 hadoop、spark集群搭建

(一台master,三台slave)所用的软件版本os: centos7hadoop: hadoop-2.9.2.tar.gzjdk: jdk-8u131-linux-x64.rpmspark: spark-2.4.7-bin-hadoop2.7.tgz1. 安装java将jdk的rpm包上传到在各个节点上,使用rpm安装。rpm -ivh jdk-8u131-linux-x64.rpm增加java的环境变量:[root@master ~]# vi /etc/profi

2020-11-20 10:23:49 392

原创 Spring中的事务

1. Spring 支持两种方式的事务管理1.1 编程式事务通过 TransactionTemplate或者TransactionManager手动管理事务,实际应用中很少使用。使用TransactionTemplate 进行编程式事务管理的示例代码如下:@Autowiredprivate TransactionTemplate transactionTemplate;public void testTransaction() { transactionTemplate.exec

2020-05-17 20:41:24 244

原创 动态代理的实现

动态代理的常用实现方式是反射。但动态代理不止有反射一种实现方式,例如,动态代理可以通过 CGLib 来实现,而 CGLib 是基于 ASM(一个 Java 字节码操作框架)而非反射实现的。1. JDK Proxy 和 CGLib 的区别JDK Proxy 是 Java 语言自带的功能,无需通过加载第三方类实现;Java 对 JDK Proxy 提供了稳定的支持,并且会持续的升级和更新 JDK Proxy;JDK Proxy 是通过拦截器加反射的方式实现的;JDK Proxy 只能代理继承接口的类

2020-05-13 21:32:12 222

原创 对锁的理解和手动模拟死锁

1. 死锁死锁是指两个线程同时占用两个资源,又在彼此等待对方释放锁资源,如下图所示:演示代码如下:import java.util.concurrent.TimeUnit;public class LockExample {    public static void main(String[] args) {    &nb

2020-05-11 21:43:21 172

原创 synchronized 和 ReentrantLock 源码解析

1. synchronized 和 ReentrantLock 是如何实现的,它们之间的区别synchronized 属于独占式悲观锁,是通过 JVM 隐式实现的,synchronized 只允许同一时刻只有一个线程操作资源。在 Java 中每个对象都隐式包含一个 monitor(监视器)对象,加锁的过程其实就是竞争 monitor 的过程,当线程进入字节码 monitorenter 指令之后...

2020-05-03 20:52:39 203

原创 ThreadPoolExecutor 的参数含义及源码解析

1. 线程池线程池是为了避免线程频繁的创建和销毁带来的性能消耗,而建立的一种池化技术,它是把已创建的线程放入“池”中,当有任务来临时就可以重用已有的线程,无需等待创建的过程,这样就可以有效提高程序的响应速度。若要使用线程池一定离不开ThreadPoolExecutor ,在阿里巴巴的《Java 开发手册》中是这样规定线程池的:线程池不允许使用 Executors 去创建,而是通过 Thread...

2020-05-02 21:46:40 788

原创 线程的状态、工作原理和常见面试题

1. 线程的状态线程的状态在 JDK 1.5 之后以枚举的方式被定义在 Thread 的源码中,它总共包含以下 6 个状态:NEW,新建状态,线程被创建出来,但尚未启动时的线程状态;RUNNABLE,就绪状态,表示可以运行的线程状态,它可能正在运行,或者是在排队等待操作系统给它分配 CPU 资源;BLOCKED,阻塞等待锁的线程状态,表示处于阻塞状态的线程正在等待监视器锁,比如等待执行 ...

2020-05-01 23:19:50 291

原创 HashMap 源码分析及 JDK8 的优化

1. 底层数据结构在JDK1.7中HashMap是以数组加链表的形式组成的,JDK1.8之后新增了红黑树的组成结构,当链表大于8并且容量大于64时,链表结构会转换成红黑树结构,它的组成结构如下图所示:数组中的元素我们称之为哈希桶,它的源码如下:static class Node<K,V> implements Map.Entry<K,V> { fin...

2020-04-12 15:39:59 106

原创 String源码解析及常见面试题

一、String 源码解析1. 数据结构以主流的 JDK 版本 1.8 来说,String 内部实际存储结构为 char 数组,源码如下:public final class String implements java.io.Serializable, Comparable<String>, CharSequence { private final char value[];...

2020-04-11 22:47:58 272

原创 分布式事务

1. 什么是分布式事务 简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,本地事务是解决单个数据源上的数据操作的一致性问题的话,而分布式事务就是为了保证不同数据库的数据一致性。 从客户端角度,多进程并发访问时,更新过的数据在不同进程如何获取的不同策略...

2020-02-24 17:42:29 120

原创 AQS 源码解析

AbstractQueuedSynchronizer是Java并发包java.util.concurrent的核心基础组件,是实现Lock的基础。1. AQS类结构属性// 属性private transient volatile Node head;// 同步队列头节点private transient volatile Node tail;// 同步队列尾节点priv...

2020-02-17 20:21:18 193

原创 8. 秒杀系统--设计兜底方案

高可用建设的着手点 说到系统的高可用建设,它其实是一个系统工程,需要考虑到系统建设的各个阶段,也就是说它其实贯穿了系统建设的整个生命周期,如下图所示: 具体来说,系统的高可用建设涉及架构阶段、编码阶段、测试阶段、发布阶段、运行阶段,以及故障发生时。架构阶段:架构阶段主要考虑系统的可扩展性和容错性,要避免系统出现单点问题。例如多机房单元化部署,即使某个城市...

2020-02-17 16:29:21 747

原创 7. 秒杀系统-- “减库存” 设计的核心逻辑

减库存的几种方式总结来说,减库存操作一般有如下几个方式:下单减库存,即当买家下单后,在商品的总库存中减去买家购买数量。下单减库存是最简单的减库存方式,也是控制最精确的一种,下单时直接通过数据库的事务机制控制商品库存,这样一定不会出现超卖的情况。但是你要知道,有些人下完单可能并不会付款。 付款减库存,即买家下单后,并不立即减库存,而是等到有用户付款后才真正减库存,否则库存一直保留给其他买家...

2020-02-17 16:14:57 631

原创 AQS 详解

AQS的全称AbstractQueuedSynchronizer,抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。AQS 是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如 ReentrantReadWriteLock,Synchron...

2020-02-16 10:19:53 480

原创 6. 秒杀系统-影响性能的因素和提高系统性能的方法

影响性能的因素 “性能”,服务设备不同对性能的定义也是不一样的,例如 CPU 主要看主频、磁盘主要看 IOPS(Input/Output Operations Per Second,即每秒进行读写操作的次数)。我们讨论的主要是系统服务端性能,一般用 QPS(Query Per Second,每秒请求数)来衡量,还有一个影响和 QPS 也息息相关,那就是响应时间(Response T...

2020-02-15 21:08:39 393

原创 5. 秒杀系统--流量削峰

在秒杀系统的流量监控图中,它是一条直线,但是在秒杀开始那一秒是一条很直很直的线,这是因为秒杀请求在时间上高度集中于某一特定的时间点。这样一来,就会导致一个特别高的流量峰值,它对资源的消耗是瞬时的。但是对秒杀这个场景来说,最终能够抢到商品的人数是固定的,也就是说 100 人和 10000 人发起请求的结果都是一样的,并发度越高,无效请求也越多。但是从业务上来说,秒杀活动是希望更多的人来...

2020-02-15 20:42:19 227

原创 生产消费者模式--BolockingQueue实现

1. BolockingQueue实现import java.util.Random;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;class Producer implements Runnable{ private final Blocking...

2020-02-14 20:39:45 170

原创 4. 秒杀系统--处理系统的“热点数据”

假设你的系统中存储有几十亿上百亿的商品,而每天有千万级的商品被上亿的用户访问,那么肯定有一部分被大量用户访问的热卖商品,这就是我们常说的“热点商品”。这些热点商品中最极端的例子就是秒杀商品,它们在很短时间内被大量用户执行访问、添加购物车、下单等操作,这些操作我们就称为“热点操作”。为什么要关注热点?因为热点会对系统产生一系列的影响。首先,热点请求会大量占用服务器处理资源,...

2020-02-14 20:28:48 492

原创 一致性 Hash 算法

一致性哈希算法在分布式缓存领域的 MemCached,负载均衡领域的 Nginx 以及各类 RPC 框架中都有广泛的应用。它主要是为了解决传统哈希函数添加哈希表槽位数后要将关键字重新映射的问题。普通的哈希表算法一般都是计算出哈希值后,通过取余操作将 key 值映射到不同的服务器上但是当服务器数量发生变化时,取余操作的除数发生变化,所有 key 所映射的服务器几乎都会改变,这对分布式缓...

2020-02-13 21:48:55 579 1

原创 3. 秒杀系统--动静分离

动静分离的目的就是实现系统的 “快”,抽象来讲就只有两点:一是提高单次请求的效率;二是减少没必要的请求。所谓“动静分离”,其实就是把用户请求的数据(如 HTML 页面)划分为“动态数据”和“静态数据”。简单来说,“动态数据”和“静态数据”的主要区别就是看页面中输出的数据是否和 URL、浏览者、时间、地域相关,以及是否含有 Cookie 等私密数据。比如说:很多媒体类的网站,某...

2020-02-13 21:12:00 278

原创 1. 秒杀系统介绍

简单来说,秒杀就是在同一个时刻有大量的请求争抢购买同一个商品并完成交易的过程,用技术的行话来说就是大量的并发读和并发写。秒杀系统本质上就是一个满足大并发、高性能和高可用的分布式系统1. 秒杀系统架构设计的关键点 首先需要从高维度出发,从整体上思考问题。在我看来,秒杀其实主要解决两个问题,一个是并发读,一个是并发写。并发读的核心优化理念是尽量减少用户到服务端来“读...

2020-02-13 20:05:05 467

原创 Synchronized 详解

一、Synchronized 的基本使用Synchronized 的作用主要有三个:确保线程互斥的访问同步代码 保证共享变量的修改能够及时可见 有效解决重排序问题从语法上讲,Synchronized 总共有三种用法:修饰实例方法,作用于当前对象实例加锁,进入同步代码前要获得当前对象实例的锁。 修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁。也就是给当前...

2020-02-11 10:41:16 1893

原创 2. 秒杀系统---不同场景下的不同架构案例

如果你想快速搭建一个简单的秒杀系统,只需要把你的商品购买页面增加一个“定时上架”功能,仅在秒杀开始时才让用户看到购买按钮,当商品的库存卖完了也就结束了。这就是当时第一个版本的秒杀系统实现方式。但随着请求量的加大(比如从 1w/s 到了 10w/s 的量级),这个简单的架构很快就遇到了瓶颈,因此需要做架构改造来提升系统性能。这些架构改造包括:把秒杀系统独立出来单独打造一个系统,这...

2020-02-10 20:50:05 358

原创 ThreadLocal 相关知识点

1.ThreadLocal 是什么? ThreadLocal 是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,适用于各个线程不共享变量值的操作。2. ThreadLocal 工作原理是什么? TreadLocal 原理:每个线程的内部都维护了一个 Thread...

2020-02-09 10:38:31 180

原创 单点登录系统的实现2

一、共享Session 共享Session可谓是实现单点登录最直接、最简单的方式。将用户认证信息保存于Session中,即以Session内存储的值为用户凭证,这在单个站点内使用是很正常也很容易实现的,而在用户验证、用户信息管理与业务应用分离的场景下即会遇到单点登录的问题,在应用体系简单,子系统很少的情况下,可以考虑采用Session共享的方法来处理这个问题。 ...

2020-02-08 21:10:16 163

原创 单点登录系统的实现1

一、什么是单点登录? 单点登录的英文名叫做:Single Sign On(简称SSO)。在初学/以前的时候,一般我们就单系统,所有的功能都在同一个系统上。为了合理利用资源和降低耦合性,于是把单系统拆分成多个子系统。简单来说,单点登录就是在多个系统中,用户只需一次登录,各个系统即可感知该用户已经登录。 二、多系统登录的问题...

2020-02-08 20:51:41 198

原创 红黑树

红黑树是一个平衡的二叉树,但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能在 lgN 次比较内结束,但是这样在动态插入中保持树的完美平衡代价太高,所以,我们稍微放松一下限制,希望找到一个能在对数时间内完成查找的数据结构。这个时候,红黑树站了出来。 红黑树需要满足的五条性质:节点是红色或者是黑色; 根节点是黑色; 每个叶节点(NIL或空节点)是黑色; 每...

2020-02-07 20:56:08 106

原创 Hibernate 和 Mybatis的对比

第一方面:开发速度的对比 就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。 比起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项目需求去考虑究竟哪一个更适合项目开发,比如:一个项目中用到的复杂查询基本没有,就是简单...

2020-02-07 14:22:45 100

原创 Mybaits 常见面试题

1、谈谈你对 MyBatis 的理解?Mybatis是一个半ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 Statement 等繁杂的过程。程序员直接编写原生态 SQL,可以严格控制 SQL 执行性能,灵活度高。 MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的...

2020-02-07 14:12:54 202

转载 Mybatis 中的事务

1. Mybaits中的事务接口TransactionpublicinterfaceTransaction{ConnectiongetConnection()throwsSQLException;voidcommit()throwsSQLException;voidrollback()throwsSQLException;voi...

2020-02-07 14:07:29 376

转载 Mybatis 中使用的设计模式

Mybatis至少遇到了以下的设计模式的使用:Builder模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder; 工厂模式,例如SqlSessionFactory、ObjectFactory、MapperProxyFactory; 单例模式,例如Er...

2020-02-07 14:03:33 77

原创 Mybatis 的工作原理

核心部件:SqlSession Executor StatementHandler ParameterHandler ResultSetHandler TypeHandler MappedStatement Configurationmybatis全局配置文件:<?xml version="1.0" encoding="UTF-8" ?><!DOCTY...

2020-02-07 13:22:28 125

原创 布隆过滤器

题目描述一个网站有 100 亿 url 存在一个黑名单中,每条 url 平均 64 字节。这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?题目解析不考虑细节的话,此题就是一个简单的查找问题。对于查找问题而言,使用散列表来处理往往是一种效率比较高的方案。不使用散列表的原因? 100 亿是一个很大的数量级,这里每条 url ...

2020-02-05 14:41:03 85

原创 Cookie 与 Session 的区别

1. Cookie 和 Session 有什么不同?作用范围不同,Cookie 保存在客户端(浏览器),Session 保存在服务器端。 存取方式的不同,Cookie 只能保存 ASCII,Session 可以存任意数据类型,一般情况下我们可以在 Session 中保持一些常用变量信息,比如说 UserId 等。 有效期不同,Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能...

2020-02-05 10:37:16 167

原创 Cookie、Session和Token

在Web应用中,HTTP请求是无状态的。即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开一个页面都需要登录一下,就出现了cookie,Session。Cookie Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录...

2020-02-05 10:20:40 93

原创 计算机操作系统常见面试题

1、简单说下你对并发和并行的理解?并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生; 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件;2、同步、异步、阻塞、非阻塞的概念?同步:当一个同步调用发出后,调用者要一直等待返回结果。通知后,才能进行后续的执行。 异步:当一个异步过程调用发出后,调用者不能立刻得到返回结果。实际处理这个调用的部件在完...

2020-02-05 09:49:32 646

原创 计算机网络

一、概述网络的网络网络把主机连接起来,而互联网是把多种不同的网络连接起来,因此互联网是网络的网络。ISP 互联网服务提供商 ISP 可以从互联网管理机构获得许多 IP 地址,同时拥有通信线路以及路由器等联网设备,个人或机构向 ISP 缴纳一定的费用就可以接入互联网。 目前的互联网是一种多层次 ISP 结构,...

2020-02-03 21:46:21 303

原创 LinkedHashMap

1. 简介LinkedHashMap 可以认为是 HashMap+LinkedList,它既使用 HashMap 操作数据结构,又使用 LinkedList 维护插入元素的先后顺序,内部采用双向链表(doubly-linked list)的形式将所有元素( entry )连接起来。LinkedHashMap 继承了 HashMap,允许放入 key 为 null 的元素,也允许插入...

2020-01-19 19:01:14 218

原创 ArrayList

ArrayList就是数组列表,主要用来装载数据,当我们装载的是基本类型的数据int,long,boolean,short,byte…的时候我们只能存储他们对应的包装类,它的主要底层实现是数组Object[] elementData。与它类似的是LinkedList,和LinkedList相比,它的查找和访问元素的速度较快,但新增,删除的速度较慢。小结:ArrayList底层是...

2020-01-18 21:34:56 252

原创 Java 集合中常见的面试题

1. Arraylist 与 LinkedList 异同是否保证线程安全:ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全; 底层数据结构:Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向循环链表数据结构; 插入和删除是否受元素位置的影响:①ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元...

2020-01-18 20:21:31 126

分布式常见的面试题(java)

分布式架构常见的面试题,需要用XMind打开。

2018-12-06

面试问题汇总

Java面试问题汇总

2018-10-15

空空如也

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

TA关注的人

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