自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

萌白在努力的博客

希望从萌白晋级大白,努力冲冲冲!!!

  • 博客(68)
  • 资源 (5)
  • 收藏
  • 关注

原创 消息队列:入门了解常见的消息队列

MQ的衡量指标有哪些?服务性能数据存储集群架构MQ的三大特性:异步削峰解耦ActiveMQ特点:完全支持JMS规范的消息中间件丰富的API拥有多种集群构建模式缺点与其他MQ相比,性能平庸不适用高并发、大数据的业务场景适用:中小型企业,传统行业集群模式:Master-Slave模式NetWorker模式:两组Master-Slave模式通信构成分布式模式Kafka特点:分布式发布-订阅消息系统基于Pull的模式来处理消

2021-05-08 23:40:41 170 1

原创 Spring基础:AOP入门理解与使用

问题:什么是AOP?AOP:面向切面编程主要目的是为了解耦,相当于拦截器。它可以让一组类共享相同的行为。问题:AOP织入时机?编译时织入AspectJ类加载时织入AspectJ 5+ 和 AspectWerkz运行时织入Spring AOP问题:Spring AOP的代理模式是怎样的?Spring AOP是动态代理:如果目标对象实现了接口,则默认采用JDK动态代理如果目标对象没有实现接口,则采用CGlib进行动态代理问题:Spring AOP

2021-05-04 18:32:55 351 1

原创 编程基础:理解编程范型

问题:什么是编程范型?编程范型是一种不是编程语言而是一种提供并决定了程序员对程序执行的看法。不同的编程语言也会提倡不同的“编程范型”。一些语言是专门为某个特定的范型设计的。Smalltalk和Java支持面向对象编程Haskell和Scheme则支持函数式编程一个完整的应用可以由多种范型构成,而不需要拘束于一种范型,多种范型相辅相成。问题:目前有哪些常用的编程范型?面向过程编程(POP):是一种以过程为中心的编程思想程序从上到下一步一步依序执行,像解题一样,一步一步的解开问题。

2021-05-04 14:28:33 281

原创 Spring基础:Spring依赖注入入门使用

问题:Spring的配置方式有几种?xml配置模式:复杂、效率低Java配置模式(SpringBoot推荐配置模式):约定规则、配置简单、注解式。本文基于这种模式。问题:声明Bean的注解的方式?业务型:@Component:组件,没有明确角色@Service:在业务逻辑层(service层)使用@Repository:在数据访问层(dao层)使用@Controller:在展现层(MVC->Spring MVC)使用配置型:@Configuration:声明当前类是一个配

2021-05-04 12:59:31 125

原创 Spring基础:入门理解IOC

问题:什么是IOC?IOC:控制反转控制:控制对象的创建及销毁(生命周期)反转:将对象的控制权交给IOC容器。技术描述:简单来说,在类A中需要依赖类B,传统的操作就是在类A中创建出类B,而IOC就是将类B在外部创建,从类A的构造函数中传入。而管理着这个类B的生命周期的类就是IOC容器。问题:什么是依赖注入?IOC的实现方式有两种依赖注入需要注入的类被动的接收对象,通过类型或名称来判断将不同的对象注入到不同的属性中。依赖查找主动索取相应类型的对象,获得依赖对象的时间也可

2021-05-03 21:55:50 57

原创 开发工具:定时任务服务系统

烦恼:日常开发时经常要用到定时器虽然SpringBoot提供的Scheduled还不错,但是增加了业务系统复杂度,想着要不独立出来一个系统运作吧,而且要复用性够强才行。思考:日常业务中有哪些类型的定时任务呐定时修改数据状态。需要操作数据库能力。但是又不能依赖具体数据库,要像个工具一样独立。定时触发某个任务。需要处理业务能力。但是不能依赖于具体业务,不然就对某个项目耦合了。思考:系统核心能力有哪些,以及工具选用最核心的能力操作数据库,但可以不依赖数据库,连接与sql执行可操作空间大:

2021-05-03 16:30:25 239 1

原创 Java工具:高性能并发工具Disruptor

问题:Disruptor是什么?Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。应用:Apache Storm、Camel、Log4j 2等源码:https://github.com/LMAX-Exchange/disruptor问题:Disruptor的核心原理是什么?与Java内置的并发队列类似ArrayBlockingQueueLinkedBlockingQ

2021-05-03 15:39:55 346

原创 Java工具:定时器工具入门理解

问题:定时器的应用场景有哪些?定时进行数据备份对系统应用进行心跳监控定时同步信息到持久化数据库定时检测订单的支付状态问题:定时器开发工具有哪些?Elastic-job:分布式定时任务不支持动态添加任务分布式支持集群Quartz:企业级定时任务支持动态添加任务伪分布式支持集群问题:如何简单理解Elastic-job?最大特点-分布式定时任务:概念:将一个任务拆分成多个独立的任务项,由分布式的服务器分别执行某一个或几个分片项。例子:统计100个数值,两台服

2021-05-02 12:46:41 213 1

原创 架构基础:数据分析系统架构入门理解

问题:数据分析系统有哪些?日志分析系统大数据分析系统。。。。问题:如何理解OLTP与OLAP?OLTP:On-Line Transaction Processing system,在线事务处理系统特点:事务、一致性、持久化、高可用例子:业务系统OLAP:On-Line analytical Processing system,在线分析处理系统特点:维度、快照例子:大数据、人工智能问题:OLAP的工作原理是怎样的?具体流程:输入数据。流式读取文件,传入到计算

2021-05-02 01:21:41 274 1

原创 架构基础:流媒体系统架构入门理解

问题:流媒体系统的关键技术是什么?切片技术:用户的滑动播放条就是一个选择切片过程。实现:ffmpeg(已集成压缩技术)压缩技术:在相同画质情况下用最小的流量实现:H.264压缩格式、H.265压缩格式原理:画面被编码成很多歌宏块(16*16像素),画面发生切换时,宏块未必切换,同样的宏块(画面区块像素点全部无变化)将会保留,移除后面相同的宏块,达到压缩效果。问题:流媒体的系统设计是怎样的?录制->编码->流媒体发放->CDN->客户端直播的过程一般都

2021-05-02 00:42:16 998 1

原创 架构基础:即时通信架构入门理解

问题:即时通信的基础模型?简单长连接模式技术:TCP/IP、UDP、WebSocket、MQTT等节省流量长连接模式:技术:UDP、压缩、自定义应用程序协议问题:即时通信的难点有哪些?计算信息加密与解密高性能压缩算法IO的多路复用通讯成本压缩成本瞬时带宽问题内存维护连接成本高维护socket需及时回收,不然易导致内存泄漏通信的信息(最核心问题)信息的顺序离线的消息问题:如何确定信息的顺序?全局自增IDID采用雪花模型。

2021-04-30 21:38:44 382 2

原创 架构基础:电商系统架构入门理解

问题:电商系统的主要难点在哪里?业务庞大,子系统多。并发大,需要容灾。CA要求高,也需要一定的P,三者无法兼得。一致性(Consistency)可用性(Availability)分区容错性(Partition tolerance)问题:如何合理减库存?误点:每次减存操作都进行写DB每次读取库存都进行读DB对DB进行高频次的单条数据操作关键点:服务是无状态的数据操作要批量写入保持最终一致性核心思路:利用内存(redis数据库)对读写操作进行缓存,记录库存变

2021-04-30 18:27:03 305 2

原创 分布式基础:入门理解分布式共识算法paxos

问题:什么是分布式共识?理解:分布式共识就是多个应用在某一项决策上达成共识并通过决策,然后将决策应用到每一个应用上。应用:区块链、redis的哨兵选举机制问题:如何实现分布式共识?目前有三种算法:paxos算法:Chubby分布式锁Raft算法:redis哨兵选举机制BTF算法:区块链的应用问题:paxos的背景理解paxos是由Leslie Lamport 用古希腊Paxos岛的故事模型进行描述的,那个小岛上十分富有,人人都做生意,没有全职的议员,议员不是经常在仪会,面对需要决

2021-04-29 21:51:42 439

原创 Linux基础:根目录文件说明

2021-04-29 17:59:52 70

原创 编程基础:入门理解BIO、NIO、AIO

问题:什么是BIO?BIO(同步并阻塞):一个请求对应一个线程,如果线程数不够连接则会等待空余线程或者拒绝连接。核心原理:利用CPU中断阻塞线程进入休眠,将执行权限交给其他线程。优缺点:优点:阻塞是不会占用系统资源且程序易编程与理解。非常适合缺点:高并发场景需要较高的线程数量(资源占用);线程切换有成本。使用范围:适用于连接数目比较小且固定的场景,适合处理重量级IO,这种方式对服务器资源要求比较高,并发局限于应用中。并行量特别大的场景除外。问题:什么是NIO?NIO(同

2021-04-29 17:47:26 157

原创 分布式基础:入门理解分布式

问题:什么是分布式?理解分布式需要区分三种系统架构:单机部署:单台机器(服务器)上部署了所有的服务缺点:处理能力有限,服务器一崩,服务就无法提供。优点:容易部署,适合小网站(流量少,不严谨)集群部署:同一个服务部署在多台服务器上(水平扩展),用一个负载均衡调度器进行请求调度。缺点:业务代码扩展困难,代码耦合度大,系统逐渐庞大后维护困难。优点:系统节点扩展非常容易分布式部署:服务细分,按照业务功能,拆分成一个个独立的子系统,它们之间通过RPC或HTTP方式通信。缺

2021-04-28 22:18:25 173 1

原创 数据库基础:入门理解缓存

问题:什么是缓存?缓存就是数据交换的缓冲区,是存贮数据的临时地方。缓存的本质就是用空间换时间。缓存读的例子:超市的展架上存放的展品(缓存区)就可以理解为缓存,看到有的话就可以直接拿然后付钱,如果没有的话,我们需要问售货员(服务器),然后售货员查询仓库(数据库)有没有然后拿给用户。可见,从仓库拿肯定会比用户直接从展架上拿更麻烦。缓存写的例子:要将一堆鸡蛋从A点搬到B点,不使用箩筐运的时候就只能一只一只效率低下的运,使用箩筐(缓冲区)时可以一批一批的运。箩筐临时存储了小批量的鸡蛋。问题:为什么要使

2021-04-26 18:33:38 868

原创 数据库基础:入门理解事务

问题:什么是事务?事务是数据库操作的最小工作单元,一个事务中的所有SQL语句作为一个整体一起向系统提交,要么都执行、要么都不执行。事务是主要是为了解决多个SQL语句操作时,带来的多个事务并发执行的问题。主要是为了原子性、一致性、隔离性。注意:单句SQL语句提交执行本身也是一次事务。问题:什么ACID?原子性(Atomic):操作不可再分,事务的所有操作要么全部执行,要么全部失败 。一致性(Consistency):事务执行前后数据关系不被破坏。隔离性(Isolation):多个事务间执行

2021-04-24 22:32:46 204 1

原创 数据库基础:入门理解索引

问题:为什么需要使用索引?数据查询的最简单方式:全表扫描,将整张表的数据全部或分批次的加载到内存中,存储的最小单位是块或者页,它是由多行数据组成的,将这些块都加载进来,然后逐个块或者页去轮询,找到目标并返回。这种方式普遍被认为十分的慢,但是在数据量不大的情况下十分适用,甚至比使用索引更快。索引最主要的目的是在大容量的数据情况下能够快速查询数据。索引类似日常的字典一样,通过拼音、部首等快速查找对应的字体。问题:什么样的信息能成为索引?能把该记录限定在一定查找范围的信息,如主键主键、唯一键、普通

2021-04-22 20:13:28 79

原创 数据库基础:入门理解数据库是什么?

问题:什么是数据库?百度百科:数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。理解:日常开发的应用中,数据都是在内存中进行交互的,如果需要将处理后的数据结果保存下来,以便下一次使用(关机、重启、程序重启后等),就需要将数据保存(持久化)到硬盘(容量大,难丢失)中。数据库就是能让我们的程序应用更容易的保存数据,并提供一整套的解决方案(读、写、事务、数据一致性等等),根据不同的数据格式的数据持久化,也会有不同的数

2021-04-22 19:33:08 199

原创 Java基础:ClassLoader简单理解

问题:什么是ClassLoader?ClassLoader的作用就是在程序运行时加载类到JVM中ClassLoader接收.class,然后产出bytecode给JVM执行引擎去执行问题:为什么需要多个ClassLoader?需要多种方式加载类从文件中加载从内存中加载从网络中加载 。。。加载方式有策略需求:缓存安全统计代理。。。解决版本问题同层不同的ClassLoader加载的类互相不影响子层的ClassLoader可以看到父层的ClassLoader委

2021-04-21 21:22:01 115 1

原创 Java基础:简单理解类的实例对象

注意,本文主要针对常见的Hotspot虚拟机,不同虚拟机实现有所差异。问题:实例对象是什么?实例对象就是根据类创建出来的。例如,人类就是一个类别,这个类别定义了我们人类具有一定的特征(属性)与行为(方法),具体到我和你就是实例对象。问题:实例对象的生命周期是怎样的?加载(load)从磁盘加载到内存——ClassLoader静态数据初始化(包括静态区域“{…}”)——触发原因new xxx()访问该类静态成员手动使用ClassLoader加载完成后进入loaded状态

2021-04-21 20:20:14 572

原创 Java基础:尝试构建简单的ClassLoader

目标构建两个简单的ClassLoader任务:生成类字节码。读取类字节码并加载该类。远程读取类字节码并加载该类。生成类的字节码工具使用: <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.27.0-

2021-04-21 17:56:55 152 1

原创 Java基础:JVM中的GC入门理解

问题:什么是GC?为什么需要GC?GC是JVM中的垃圾回收器,主要用于回收我们不再使用的对象实例。什么情况下不需要GC,程序不创造临时的对象实例时或者内存无限大时。总的来说就是因为计算机资源有限,因此需要GC回收无用资源进行再利用。就像人类为什么需要努力,因为地球资源有限。问题:GC的STW(Stop the world)是什么?GC停止正在执行应用程序业务代码的所有线程,进行空间清理回收。STW的发生时间点在程序执行生产的垃圾比GC清理垃圾的速度快,然后内存占用达到了一定的比例时就会执行S

2021-04-20 18:51:06 361

原创 Java基础:JVM中的堆和栈的理解

问题:栈是什么?栈是一种数据结构,特性是先进后出。栈是配合程序(线程)执行的结构体,也就是说程序的执行不能没有栈,但是可以没有堆。程序执行时,栈的作用流程:执行下面代码时,栈的操作流程int add(a, b){ return a+b;} int a = 1; int b = 2; int c = add(a,b); 1和2进行压栈。预留c的值位置压栈。调用程序,预留返回位。将传入的值压栈,计算出值后,将值赋到c上。返回指针位(不删除数据,而是调整指针位进行覆盖)。问题

2021-04-20 17:26:28 360 1

原创 Java并发练习:哲学家聚餐游戏

目标:采用最优方式解答哲学家聚餐游戏问题定义:5个哲学家围在一起吃饭,餐桌上每人都拥有一盘餐食以及每人都拥有一个叉子,但是他们吃饭时需要双手都拿叉子才能吃饭,如何高效的让他们吃饭?哲学家会先进行思考,思考过后会进入饥饿状态,需要吃饭,吃完饭后完成一轮。哲学家类定义了哲学家的可进行的操作。思路定义:竞争分离:将竞争叉子的任务分离到一个单线程进行,其余耗时的操作交给多个工作线程来做创建两个任务队列:一个用于进行哲学家任务(多线程,主IO)。,另外一个进行分配叉子的任务(单线程,无竞争)。哲

2021-04-18 20:24:42 206 1

原创 Java并发练习:无锁编程

目标:利用AtomicStampedReference实现栈的压入弹出无锁编程AtomicStampedReference意义:对数据进行CAS(compareAndSet)无锁自加或者更换栈的表头之类的问题时会出现ABA问题,AtomicStampedReference通过增加版本号(时间戳)来解决这个问题。AtomicStampedReference(V initialRef, int initialStamp):初始化,传入初始数据与初始版本号getReference():获取当前引用数据

2021-04-17 17:46:17 200

原创 Java并发练习:构建一个简单的线程池

目标:构建一个简单的线程池功能如下:可提交Runnable任务。任务队列,需要支持DualStack与DualQueue。线程队列,最小线程数(一直存在),可扩展线程数。根据任务量调整线程量,任务繁忙线程数扩展到最大线程数,任务空闲清空所有空闲的扩展线程。任务队列简述:LinkedTransferQueueDualQueue:双向结构,公平的(先进先出),需要使用tryTransfer才是DualQueue的模式,调用offer就相当于普通的LinkedBlockingQueue。

2021-04-17 16:09:43 129

原创 Java并发练习:ThreadLocal的理解与使用

问题:ThreadLocal是什么?ThreadLocal线程局部变量,只能在当前线程中调用,其他线程无法访问(包括主线程)。每个Thread线程中都有一个属性threadLocals,通过ThreadLocal才能使用该属性。在应用程序中,所有线程其实是共享同一份内存的,因此数据实际上是可以互相操作的。但是这会带来很大的程序隐患,因此线程需要封闭,避免并发问题。而ThreadLocal就是用来实现把数据进行隔离,数据不共享。ThreadLocal 就是一种以空间换时间的做法,在每个 Threa

2021-04-16 23:11:29 139

原创 Java并发练习:volatile详解

问题:为什么要使用volatile?最主要的原因就是CPU的分级缓存问题,每个CPU都具有独立的缓存,而变量的值存在CPU的独立缓存中,没有及时进行刷新导致。CPU与Java虚拟机会对程序代码进行指令重排来优化代码。代码演示:package com.miracle.study.vola;import java.util.concurrent.TimeUnit;/** * @author Miracle * @date 2021/4/15 16:39 */public class

2021-04-15 17:07:17 83

原创 Java并发练习:高性能创建单例,面试必备

目标:高性能的创建单例关键问题避免并发创建多个单例降低锁消耗大量性能volatile确保语义上对变量的读、写操作顺序被观察到。volatile变量读写时会增加内存屏障。volatile变量读写时会禁用局部指令重排。保证对volatile的操作happens-before另一个操作。AtomicReference关键方法getAcquire()与setRelease(),它们可以确保代码不被重排序。AtomicReference与volatile的功能相似,但是它对于代码的指令

2021-04-15 16:24:03 115

原创 Java并发练习:Phaser的简单使用

目标:使用Phaser构造简单阶段任务反馈Phaser移相器:可重用的同步屏障,功能比CyclicBarrier与CountDownLatch更加灵活。onAdvance:全部线程执行完毕后会进行调用,每次都会使参数phase的值+1,可用于判断阶段。返回true的话会结束phase。register():线程进行注册,实际是进行一次信号+1。arriveAndAwaitAdvance():阻塞并等待其他线程到达,等信号值达到一定值时会通过。arriveAndDeregister():非阻塞,

2021-04-14 22:02:59 89

原创 Java并发练习:简单运用CyclicBarrier进行分治策略

目标:利用CyclicBarrier进行任务拆分与整合CyclicBarrier循环栅栏:让一组同时运行的线程到达栅栏阻塞,直到全部线程都到达(可执行一段同步程序),然后继续执行。new CyclicBarrier(int val, Runnable):val为线程数,Runnable为同步时的执行程序。await():线程内执行await()时就会进行阻塞,等待其他线程全部到达屏障。代码实现:package com.miracle.study.concurrent;import jav

2021-04-14 20:25:41 78

原创 Java并发练习:CountDownLatch与Callable运用

目标:运用CountDownLatch与Callable进行简单的计数CountDownLatch与CyclicBarrier相似,只是它只实现了一次任务拆分与整合,用来协调多个线程之间的同步。new CountDownLatch(int val):初始化时,需要设置信号值。countDown():每一次进行countDown都会是信号值-1。await():只有当信号值为0时,才会停止阻塞。Callable有返回值的线程运算体。与Runnable类似需要利用FutureTask接收返

2021-04-14 18:34:25 919

原创 Java并发练习:exchange简单使用

目标:两个线程进行数据交换exchangeexchange只能用于两个线程进行数据交换,它的交换速率是高效的exchanger.exchange(object obj):这个方法会阻塞,直到另一个线程也同样调用这个方法进行数据交换,当然也可以使用timeout避免阻塞过长时间。代码实现:package com.miracle.study.concurrent;import java.util.concurrent.Exchanger;/** * @author Miracle *

2021-04-14 17:58:23 450

原创 Java并发练习:Semaphore信号工具简单使用

目标使用Semaphore构建简单的生产者消费者模型Semaphore基于AQS实现的,用于控制临界区的线程并行数量。acquire(int val),不填值时,默认消耗一个信号,填值时根据值消耗信号。release(int val),不填值时,默认增加一个信号,填值时根据值增加信号。release的值可以比线程进来时设定的acquire中的信号值要大。代码:思路:运用两个Semaphore,分别是消费者Semaphore与生产者Semaphore进行互相消耗与增加,控制queue中的s

2021-04-14 17:45:13 66

原创 Java并发练习:构建简单的AQS实现Semaphore信号锁

目标:使用AQS实现简单的Semaphore信号锁信号锁实现:tryAcquireShared:尝试获取许可tryReleaseShared:尝试释放许可代码:package com.miracle.study.syn;import org.junit.jupiter.api.Test;import java.util.concurrent.locks.AbstractQueuedSynchronizer;/** * @author Miracle * @date 2021/

2021-04-13 22:55:19 67

原创 Java并发练习:构建简单的AQS实现互斥锁

目标:使用AQS实现简单的互斥锁互斥锁实现:tryAcquire:尝试获取锁tryRelease:尝试释放锁代码:package com.miracle.study.syn;import org.junit.jupiter.api.Test;import java.util.concurrent.locks.AbstractQueuedSynchronizer;/** * @author Miracle * @date 2021/4/13 19:59 */public cl

2021-04-13 20:40:45 109

原创 Java并发练习:synchronize练习简单构造生产者与消费者模型

目标:synchronize基本功能练习功能:上锁、解锁中断休眠与唤醒ReentrantLock同样的实现:相较于synchronize,ReentrantLock相对灵活更多,特别对于condition与中断以及非阻塞层面。https://blog.csdn.net/k295330167/article/details/115675185代码:package com.miracle.study.syn;import java.util.LinkedList;import

2021-04-13 19:57:11 64

原创 Java并发练习:ReentrantLock练习简单构造生产者与消费者模型

目标:ReenTrantLock的基本功能练习功能练习:上锁、解锁中断条件信号代码:package com.miracle.study.syn;import java.util.LinkedList;import java.util.Random;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;/** * @author Miracle *

2021-04-13 18:36:07 88

Spring基础:Spring AOP简单使用

Spring基础:Spring AOP简单使用

2021-05-04

Java工具:高性能并发工具Disruptor简单使用

Java工具:高性能并发工具Disruptor简单使用

2021-05-03

开发工具:基于Quartz的定时任务服务系统

提供定时请求以及定时执行对指定数据库执行指定sql功能

2021-05-03

Java工具:定时任务工具Elastic-job的简单使用

simple-Job.rar

2021-05-02

基于Java的socket的网络聊天程序

萌新程序猿刚学习javaSocket的练手作品

2017-04-18

空空如也

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

TA关注的人

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